Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Mine Sweeper en 26 Julio 2013, 17:13 pm



Título: [Ayuda] Una manera rapida de insertar registros a una base de datos en SQL
Publicado por: Mine Sweeper 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();
}



}
     
    }





Título: Re: [Ayuda] Una manera rapida de insertar registros a una base de datos en SQL
Publicado por: 1mpuls0 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.


Título: Re: [Ayuda] Una manera rapida de insertar registros a una base de datos en SQL
Publicado por: Mine Sweeper 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.


Título: Re: [Ayuda] Una manera rapida de insertar registros a una base de datos en SQL
Publicado por: ~ Yoya ~ 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.