inserción de registros en base de datos

bueno el motivo No es como hacer la inserción de u registro en una base de datos (Mysql) si no saber cual de los dos mecanismos de los que dispongo es mejor, tengo que subir alrededor de 1500 registros en un tiempo aproximado de 30 minutos (los registros se generan durante todo este tiempo.

Tengo varias opciones en las que he estado trabajando
1.- conforme se genera el registro, abrir la conexión subir el registro y cerrar la conexion
2.- meter todos los registros en una pila y subirlos terminando el tiempo cada 30 minutos aproximadamente
3.- subir los registros cada X cantidad de registros, o cada determinado tiempo...

alguna otra opción se tomara en cuenta....
Gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

necesidad

Todo depende de cómo necesites guardar los datos. No te vayas por la parte de optimizar el proceso, eso viene después y debe obedecer a la necesidad de los datos.

Qué pasa si los vas guardando para guardarlos cada 30 minutos y la aplicación se muere, o se va la luz o algo? Si son datos muy importantes, guárdalos de inmediato.

Si te preocupa el uso de recursos por estar abriendo una conexión y cerrándola a cada rato por estar insertando un registro, utiliza un pool de conexiones para que no se cierren realmente sino que nada más usas una y la devuelves. De ese modo lo más sencillo será que guardes el registro cuando se genera, sin tener que esperar a que se junten ni poner un timer ni nada.

has pensado en generar un txt????

Q tal amigo tuve un problema similar, tenia q cargar aproximadamente una tabla de 42 columnas con un total de 150,000 registros, de la manera q consumiera el menor tiempo, los registros se encontraban en un archivo generado por un access en formato txt.

Hice pruebas y lo q m funciono mejor y mas rapido mi problema fue algo asi:
Para hacer esto ya contaba con la estructura de la base de datos.

public boolean importatlas(){
     boolean confirmacion2=True;
     String queryv1,query2;
      conect cnn = new conect();

     try{
          queryv1 ="TRUNCATE tabla1;";

          Statement st2 = cnn.getConnection().createStatement();

          st2.executeQuery(queryv1);

          System.out.println("eliminado registros atlas");

    }catch(SQLException e)
        {

          System.out.println("Error: " + e.getMessage());

          cnn.desconectar();

        }/////fin eliminando datos obsoletos en garantia original
   
////cargamos el archivo txt

   try{

        query2 ="LOAD DATA INFILE '"+this.cadenaorigen+"' INTO TABLE tabla1 FIELDS   TERMINATED BY ',' LINES TERMINATED BY '\n' ;";
//////////esta es la instruccion de mysql para cargar datos desde el archivo txt
//////cadena origen indica el directorio donde esta ubicado el archivo txt y su nombre.

          Statement st = cnn.getConnection().createStatement();

          st.executeUpdate(query2);

             System.out.println("llenado completo Atlas ");

        }catch(SQLException e)
        {

          System.out.println("Error: " + e.getMessage());
          cnn.desconectar();

        }
////////////////////////////////////////

    return confirmacion2;

    }//fin importar atlas

El primer query lo que hace es eliminar los datos que ya se encuentran en la tabla, si no se ejecutara ese query solo t agregaria registros a los ya existentes.

entonces yo sugiero q cuando vayas generando los registros los vayas agregando a un archivo de texto

Espero haber sido de ayuda.

Saludos!!!

Imagen de ezamudio

distinto

Es un caso muy distinto, esto es un batch, es decir ya tienes los datos que quieres insertar y lo vas a hacer una sola vez. No hay mucho que pensar, simplemente es abrir conexión, insertar todos los registros y cerrar. Si acaso hacer todos los inserts en una transacción, si hay alguna restricción de que se deban insertar todos o ninguno.

El post original me suena como que hay una aplicación corriendo constantemente y recabando datos, que durante un periodo de 30 minutos son aproximadamente 1500 registros pero no precisamente a intervalos regulares. Ahí lo mejor es insertar los registros conforme se obtienen los datos, y usar un pool de conexiones para no cerrar físicamente la conexión a la base de datos.

cierto!!!!

si tienes un pool de conexiones es mejor como dice eza guardarlos de inmediato a como vayan llegando, puedes perder informacion valiosa, pero creo q deberias describir un poko mas tu aplicacion y poner ejemplo con codigo, ya que tal vez con palabras aveces nos confundimos.

Imagen de ArenasMx

Gracias

bueno el codigo es un poco extenso como para ponerlo en un post, ya que la aplicación esta la estoy trabajando en java web start y si por las policas de la misma implementación cambia la forma en la que se carga el driver imagino que si hago un pool de conexiones tendre que hacer los mismo

 To find application resources in Java Web Start, use the classloader that loaded your application, for example use the following call in the in the application;s main thread:

this.getClass().getClassLoader();

You can also use:

Thread.getCurrent().getContextClassLoader();

lo que si es cierto es que es que ya habia genrado un txt con los registros y luego hacia la conexion a la base de datos y subia todos los registros esa solución ya la "utilice" pero como bien dice eza tenia exactamente los problemas que comenta de la luz, la muerte de la aplicación o una caida de la conexión tambien...

Tambien lo que se me comento publicar en el anterior post es que lo mas importante es poder subir los datos de una sesión completa.. que queire decir eso que tengo que buscar la forma de poder asegurarme que esos 1500 registros que se generan seran cargados en la base de datos ...

se agradece la opcion del pool lo habia visto con anterioridad, no imagine que pudiera o tendria que llegar a usarla para poder resolver mi problema :S

por ultimo hay alguna diferencia en hacer un pool de conexiones en java web start?????? lo comento proque para poder hacer la aplicación conectara a la base de datos tuve que agregar el codigo fuente del conector de Mysql a la aplicación (hizo que creciera unas 4 o 5 vces de peso)

Imagen de ezamudio

cambia por completo

Sabiendo lo de java web start creo que cambia por completo el panorama de tu problema. No sé si tu aplicación está hecha para ejecutarse en una intranet, en cuyo caso está bien que la app se conecte directamente al servidor de MySQL y además no veo problema de que uses un pool de conexiones (finalmente será una aplicación tipo cliente-servidor en una red interna). Pero si hay posibilidad de que alguien ejecute la aplicación de manera remota entonces debes poner una capa intermedia entre tu app y el servidor MySQL; ya sea un web service o interfaz REST o algo para que no expongas el servidor a internet. Y en esa capa puedes recibir un archivo de texto con varios registros (o datos de un solo registro) y meterlos a la base de datos.

Imagen de ArenasMx

no la aplicación en un

no la aplicación en un principio si fue construida y hecha para ejecutarse en una intranet no hubo grandes complicaciones, ahora el detalle es que se quiere llevar ya sobre internet y pues si tenia varias dudas para el servidor de la base de datos y la cantidad maxima de conexiones que pudiera soportar MySQL de forma estable lo de la interfaz rest o un web service es algo que aun debo de revisar pero obviamente sera alguno de los dos para poder porteger a la base de datos.. gracias :D