2010-09-19 18 views
8

Tengo datos que se transmiten desde el disco y se procesan en memoria mediante una aplicación Java y que finalmente se deben copiar en SQL Server. Los datos pueden ser bastante grandes (de ahí la transmisión) y pueden requerir la inserción de hasta 100.000 filas. La solución más rápida parece estar utilizando la función de copia masiva de SQL Server. Sin embargo, no he encontrado ninguna forma para que los programas Java lo hagan de manera fácil o casi lo suficientemente rápido.¿Cuál es la forma más eficiente de copiar de forma masiva a SQL Server desde Java?

Aquí hay algunas maneras que ya hemos investigado:

  • Utilización de la clase SqlBulkCopy en .NET. Esto es muy eficiente ya que puede transmitir datos directamente desde una fuente de datos y directamente a SQL Server. El problema con este enfoque es que necesita ejecutar .NET. Quizás esto podría ser usado usando un puente de Java a .NET. Aunque, me pregunto sobre el costo de recopilar datos entre tiempos de ejecución.

  • Usando la instrucción BULK INSERT TSQL. El problema con esto es que necesita crear un archivo con el formato correcto en el disco. He visto algunos pequeños aumentos de rendimiento sobre la inserción de lotes de JDBC usando esto. Además, esto solo es útil localmente.

  • Escriba los archivos en el disco y utilice la utilidad de línea de comandos de bcp. Todavía un poco más rápido que la inserción por lotes JDBC, pero no tanto. También pierdo la capacidad de usar una transacción con este método.

  • Utilice C API. De nuevo, es muy eficiente, pero necesita usar C. Habría una forma de usar esto a través de JNI. Si hay alguna biblioteca gratuita de Java que haga esto, me gustaría saberlo.

Estoy buscando la solución más rápida. La memoria no es un problema.

Gracias!

+0

Cuando dice que el origen de los datos es Java, ¿puede dar más detalles? ¿Los datos están en la memoria de una aplicación/applet Java? – InSane

+0

Gracias por su respuesta En Sane. He hecho la pregunta un poco más detallada. –

Respuesta

1
  • Para la respuesta .NET recomendaría IKVM. Entonces su Código Java será un código .NET y podrá llamar a cualquier código .NET.
  • BULK INSERT también requiere que se pueda acceder al archivo masivo desde SQL Server. Esta es solo una opción local. El rendimiento de la actualización por lotes puede variar entre diferentes controladores JDBC.
  • Para llamadas nativas recomendaría usar JNA (acceso nativo de Java). Entonces no necesita escribir ningún código C.
+0

Esta respuesta tiene información útil si alguna vez uso una de esas soluciones. Sería genial si alguien hubiera escrito una buena biblioteca gratuita que envolviera la API C en una interfaz más agradable. Podría terminar haciéndolo yo mismo. –

0

Desde la versión 4.2 del controlador JDBC de Microsoft para SQL Server, hay una clase llamada com.microsoft.sqlserver.jdbc.SQLServerBulkCopy que hace lo mismo que la clase SqlBulkCopy de .NET.

Cuestiones relacionadas