Mejore la velocidad de las inserciones de SQL en la columna XML desde JDBC (SQL Server)

Actualmente estoy escribiendo un programa Java que recorre una carpeta de alrededor de 4000 archivos XML.

Usando un bucle for, extrae el XML de cada archivo, lo asigna a un String 'xmlContent', y usa el método PreparedStatement setString (2, xmlContent) para insertar el String en una tabla almacenada en mi SQL Server.

La columna '2' es una columna llamada 'Datos' de tipo XML.

El proceso funciona, pero es lento. Inserta unas 50 filas en la tabla cada 7 segundos.

¿Alguien tiene alguna idea de cómo podría acelerar este proceso?

Código:

{ ...declaration, connection etc etc
        PreparedStatement ps = con.prepareStatement("INSERT INTO Table(ID,Data) VALUES(?,?)");

        for (File current : folder.listFiles()){
           if (current.isFile()){
              xmlContent = fileRead(current.getAbsoluteFile());
              ps.setString(1, current.getAbsoluteFile());
              ps.setString(2, xmlContent);
              ps.addBatch();

              if (++count % batchSize == 0){
                    ps.executeBatch();
              }

           }
        }
        ps.executeBatch();   // performs insertion of leftover rows
        ps.close();
}

private static String fileRead(File file){

         StringBuilder xmlContent = new StringBuilder();

         FileReader fr = new FileReader(file);
         BufferedReader br = new BufferedReader(fr);
         String strLine = "";
         br.readLine();      //removes encoding line, don't need it and causes problems
         while ( (strLine = br.readLine() ) != null){
             xmlContent.append(strLine);
         }
         fr.close();

         return xmlContent.toString();
     }
Respuesta 1

Solo por una pequeña lectura y una prueba rápida, parece que puede obtener una aceleración decente al desactivar el AutoCommit en su conexión. Todos los tutoriales de consulta por lotes que veo también lo recomiendan. Tales como http://www.tutorialspoint.com/jdbc/jdbc-batch-processing.htm

Desactívela y luego suelte una confirmación explícita donde desee (al final de cada lote, al final de toda la función, etc.).

 conn.setAutoCommit(false);
 PreparedStatement ps = // ... rest of your code

 // inside your for loop

     if (++count % batchSize == 0) 
     {
           try {
             ps.executeBatch();
             conn.commit();
           }
           catch (SQLException e)
           {
              // .. whatever you want to do
              conn.rollback();
           }
     }
Respuesta: 2

Necesito llamar a un procedimiento almacenado usando el controlador JTDS jdbc. Pero este procedimiento almacenado necesita un tipo de estructura como parámetro. El Jtds CallableStatement no tiene un método que establezca una estructura, así que he ...

Estoy usando el controlador web selenium con lenguaje Java. cuando hay dos botones en una ventana emergente, es decir, ok y cancelar, puede manejarse fácilmente con el controlador web utilizando el siguiente código: Alerta de alerta = controlador ...

Tengo una pregunta sobre los eventos enviados por el servidor, me gustaría implementar en una aplicación de arranque de primavera, pero la pregunta que quiero escuchar estos eventos de la otra aplicación de arranque de primavera o back-end ...

Estoy leyendo sobre GWT y hasta ahora suena demasiado bueno para ser verdad (!). Me gustaría comenzar a invertir el tiempo para realmente aprender GWT, pero tendría algunos usos muy específicos y odiaría gastar ...