elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  [Ayuda] Una manera rapida de insertar registros a una base de datos en SQL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] Una manera rapida de insertar registros a una base de datos en SQL  (Leído 3,817 veces)
Mine Sweeper

Desconectado Desconectado

Mensajes: 29


Ver Perfil
[Ayuda] Una manera rapida de insertar registros a una base de datos en SQL
« en: 26 Julio 2013, 17:13 pm »

Buenos Dias, tengo un codigo que lo que hace es traer informacion de un AS 400 e insertarla en un servidor SQL

El problema es que son alrededor de 4 millones de registros entonces al hacer el insert a sql tarda alrededor de 9 horas, lo que hago es insertarlos de 100mil en 100mil

Existe una manera de hacerlo mas rapido?

Este es mi codigo:
Código:
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
import java.io.IOException;

public class Main {
public static void main(String[] args) {
ForsConn forsConn;
SqlConn sqlConn;



try {
forsConn= new ForsConn();
sqlConn = new SqlConn();
} catch (Exception e1) {
e1.printStackTrace();
}

ResultSet rsDownload;
ResultSet rsInsert;
ResultSet rsDelete;
String sqlInsert="";
String LAKT="";
String delete = "";
String[][] Arreglo = new String[100000][15];

delete= "DELETE FROM Tbl_FORSD_LAKTX0";

LAKT = "SELECT DOS_LAKT_FIRMNR, DOS_LAKT_WERKNR, DOS_LAKT_BCHGNR, " +
"DOS_LAKT_BCHGPO, DOS_LAKT_BUARTT, DOS_LAKT_TEILNR, DOS_LAKT_MNGABG, " +
"DOS_LAKT_MNGANN, DOS_LAKT_AUFTNR, DOS_LAKT_AUFTPO, OBTENR, " +
"DOS_LAKT_ZGGUNV, DOS_LAKT_BSTART, DOS_LAKT_BLGNRR, DOS_LAKT_BCHDAT " +
"FROM FORSDR45.LAKTX0 " +
"WHERE (((DOS_LAKT_FIRMNR)=4) AND ((DOS_LAKT_BUARTT)='01' Or (DOS_LAKT_BUARTT)='12') " +
"AND ((DOS_LAKT_ZGGUNV)>=('2013')))";

try {
rsDelete=SqlConn.getDataSql3(delete);
System.out.println ("Registros Borrados");
} catch (SQLException e1) {
e1.printStackTrace();
}

try
{

rsDownload=ForsConn.getDataFors(LAKT);
int x;
rsDownload.next();
while(rsDownload.getString(1)!=null)
{
z:
for(x=0; x<99999; x++)
{
System.out.println (x);
if(rsDownload.next()){
       
          Arreglo[x][0]= rsDownload.getString("DOS_LAKT_FIRMNR");
          Arreglo[x][1]= rsDownload.getString("DOS_LAKT_WERKNR");
  Arreglo[x][2] = rsDownload.getString("DOS_LAKT_BCHGNR");
          Arreglo[x][3] = rsDownload.getString("DOS_LAKT_BCHGPO");
  Arreglo[x][4] = rsDownload.getString("DOS_LAKT_BUARTT");
          Arreglo[x][5] = rsDownload.getString("DOS_LAKT_TEILNR");
  Arreglo[x][6] = rsDownload.getString("DOS_LAKT_MNGABG"); 
          Arreglo[x][7] = rsDownload.getString("DOS_LAKT_MNGANN");
  Arreglo[x][8] = rsDownload.getString("DOS_LAKT_AUFTNR"); 
          Arreglo[x][9] = rsDownload.getString("DOS_LAKT_AUFTPO");
  Arreglo[x][10] = rsDownload.getString("OBTENR");
          Arreglo[x][11] = rsDownload.getString("DOS_LAKT_ZGGUNV");
  Arreglo[x][12] = rsDownload.getString("DOS_LAKT_BSTART");
          Arreglo[x][13] = rsDownload.getString("DOS_LAKT_BLGNRR");
          Arreglo[x][14] = rsDownload.getString("DOS_LAKT_BCHDAT");
         
          /*System.out.println (Arreglo[x][0]);
          System.out.println (Arreglo[x][1]);
          System.out.println (Arreglo[x][2]);
          System.out.println (Arreglo[x][3]);
          System.out.println (Arreglo[x][4]);
          System.out.println (Arreglo[x][5]);
          System.out.println (Arreglo[x][6]);
          System.out.println (Arreglo[x][7]);
          System.out.println (Arreglo[x][8]);
          System.out.println (Arreglo[x][9]);
          System.out.println (Arreglo[x][10]);
          System.out.println (Arreglo[x][11]);
          System.out.println (Arreglo[x][12]);
          System.out.println (Arreglo[x][13]);
          System.out.println (Arreglo[x][14]);*/
         
  }
else
break z;



}

for(x=0; x<99999; x++)
{
try {

sqlInsert = "INSERT INTO Tbl_FORSD_LAKTX0 (DOS_LAKT_FIRMNR, DOS_LAKT_WERKNR, DOS_LAKT_BCHGNR, " +
"DOS_LAKT_BCHGPO, DOS_LAKT_BUARTT, DOS_LAKT_TEILNR, DOS_LAKT_MNGABG, " +
"DOS_LAKT_MNGANN, DOS_LAKT_AUFTNR, " + "DOS_LAKT_AUFTPO, OBTENR, " +
"DOS_LAKT_ZGGUNV, DOS_LAKT_BSTART, DOS_LAKT_BLGNRR, DOS_LAKT_BCHDAT) " +
"VALUES ( '" + Arreglo[x][0] + "' , '" + Arreglo[x][1] + "' , '" + Arreglo[x][2] +
"' , '" + Arreglo[x][3] + "' , '" + Arreglo[x][4] + "','" + Arreglo[x][5] +
"','" + Arreglo[x][6] + "','" + Arreglo[x][7] + "','" + Arreglo[x][8]  +
"','" + Arreglo[x][9] +  "','" + Arreglo[x][10] + "','" + Arreglo[x][11] +
    "','" + Arreglo[x][12] + "','" + Arreglo[x][13] + "','" + Arreglo[x][14] + "')";


rsInsert=SqlConn.getDataSql3(sqlInsert);
System.out.println ("Registro Agregado");
//sql="select DOS_LAKT_BCHGNR from Tbl_FORSD_LAKTX0 where DOS_LAKT_BCHGNR=" + Arreglo[x][3].trim();

}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
catch(Exception e) {
e.printStackTrace();
}



}
     
    }





En línea

1mpuls0


Desconectado Desconectado

Mensajes: 1.186


Ver Perfil
Re: [Ayuda] Una manera rapida de insertar registros a una base de datos en SQL
« Respuesta #1 en: 26 Julio 2013, 17:30 pm »

Se podría hacer pruebas con dos formas.

Java: Programación concurrente
SQL: Mejorar las consultas.

A pesar de que no distingo muy bien el código (si puedes colocar el geshi en java) parece ser que las consultas no soy muy complejas y no hay mucho que mejorar  :xD

Ahora que sigo revisando veo que tienes un arreglo, por qué en lugar de almacenarlo no lo insertas directamente?.

La verdad es que nunca lo he hecho así y desconozco si haya una diferencia de tiempo considerable.
Tal vez habría que hacer un método para calcular el tiempo entre usar arreglo e insertarlo directamente una vez obtenido los valores, es decir utilizar 15 variables.

Saludos.


« Última modificación: 26 Julio 2013, 17:35 pm por Darhius » En línea

abc
Mine Sweeper

Desconectado Desconectado

Mensajes: 29


Ver Perfil
Re: [Ayuda] Una manera rapida de insertar registros a una base de datos en SQL
« Respuesta #2 en: 26 Julio 2013, 17:43 pm »

Si son consultas sencillas, es solo un select y un insert, estaba haciendo pruebas por eso esta mediante un arreglo, lo hice directamente y tardo aproximadamente lo mismo, cuando hice pruebas con el arreglo tardo aproximadamente dos horas, pero la prueba con el arreglo no la hice utilizando todas las columnas, por eso pienso que tardo menos, entonces ahora que lo hago con todos los campos quiero pensar que por eso tarda mas.
« Última modificación: 26 Julio 2013, 17:48 pm por MikeDavalos90 » En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 1.125



Ver Perfil
Re: [Ayuda] Una manera rapida de insertar registros a una base de datos en SQL
« Respuesta #3 en: 26 Julio 2013, 18:22 pm »

Como ha dicho Darhius, utiliza Thread. Pero tienes que tener cuidado, no vayas a crear 1,000 thread y satures el servidor donde insertas la informacion.

Tambien puedes aplicar Thread para extraer la informacion.

Saludos.
En línea

Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema al añadir registros a base de datos « 1 2 »
PHP
InGuS 13 6,070 Último mensaje 30 Marzo 2007, 23:35 pm
por Luisango
guardar registros en base de datos
Programación Visual Basic
deanelker 5 4,163 Último mensaje 17 Julio 2010, 18:49 pm
por Angeldj27
Duda expres y rapida para una consulta en base de datos!
PHP
ZharkD 2 1,859 Último mensaje 6 Agosto 2010, 18:36 pm
por ZharkD
Ordenar registros base de datos acces (Eclipse)
Java
Alexis Vargas Arteaga 2 4,767 Último mensaje 15 Noviembre 2010, 22:54 pm
por egyware
insertar imagenes en base de datos « 1 2 3 »
Bases de Datos
xemnas 20 16,085 Último mensaje 12 Enero 2012, 18:16 pm
por Novlucker
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines