java jdbc oracle11g bulkinsert direct-path

¿Es posible utilizar la inserción de ruta directa con JDBC/Java?



oracle11g bulkinsert (1)

La documentación de Oracle dice claramente esto:

If you are performing an INSERT with the VALUES clause, specify the APPEND_VALUES hint in each INSERT statement immediately after the INSERT keyword. Direct-path INSERT with the VALUES clause is best used when there are hundreds of thousands or millions of rows to load. The typical usage scenario is for array inserts using OCI. Another usage scenario might be inserts in a FORALL statement in PL/SQL

.

Así que responda a su pregunta es APEND_VALUES sugerencia. Puedo ver en su publicación que lo ha intentado pero no puede distinguir qué problema enfrenta.

Además, esta afirmación en su publicación no es correcta " Según lo que entiendo, las inserciones de ruta directa solo admiten la sintaxis de subconsulta y no la cláusula VALUES ". La documentación de Oracle da este ejemplo:

El siguiente fragmento de código PL / SQL es un ejemplo del uso de la APEND_VALUES sugerencia:

FORALL i IN 1..numrecords INSERT /*+ APPEND_VALUES */ INTO orderdata VALUES(ordernum(i), custid(i), orderdate(i),shipmode(i), paymentid(i)); COMMIT;

Enlace para la documentación de Oracle : http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables004.htm#i1009100

Código de muestra:

dbConnection.setAutoCommit(false);//commit trasaction manually String insertTableSQL = "INSERT /*+ APPEND_VALUES */ INTO DBUSER" + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES" + "(?,?,?,?)"; PreparedStatement = dbConnection.prepareStatement(insertTableSQL); preparedStatement.setInt(1, 101); preparedStatement.setString(2, "test1"); preparedStatement.setString(3, "system"); preparedStatement.setTimestamp(4, getCurrentTimeStamp()); preparedStatement.addBatch(); preparedStatement.setInt(1, 102); preparedStatement.setString(2, "test2"); preparedStatement.setString(3, "system"); preparedStatement.setTimestamp(4, getCurrentTimeStamp()); preparedStatement.addBatch(); preparedStatement.executeBatch(); dbConnection.commit();

Tenemos una aplicación escrita en C y Pro * C que inserta datos de archivos de registro en una base de datos Oracle 11.2 utilizando matrices de host e inserción masiva. Esto utiliza los consejos APPEND y NOLOGGING para aprovechar la inserción de ruta directa y reducir la cantidad de rehacer generada. NOLOGGING tiene sentido, ya que es una tabla de etapas temporal y los datos pueden recuperarse de los archivos de registro si es necesario.

Estamos tratando de replicar esta funcionalidad en Java pero no hemos podido utilizar la inserción directa de un gran número de registros. ¿Es esto posible con Java / JDBC?

Las cosas que he intentado e investigado son:

  • Procesamiento por lotes JDBC (lotes estándar y extensiones de Oracle ). Este enfoque ahorra en tiempos de ida y vuelta pero esto es insignificante ya que la aplicación está en la misma máquina que la base de datos. Tampoco usa la ruta directa.
  • La APPEND_VALUES sugerencia. Esto suena prometedor pero tiene poco sentido ya que el procesamiento por lotes JDBC no parece realmente realizar una inserción de "matriz" de muchos registros.

Por lo que entiendo, las inserciones de ruta directa solo admiten la sintaxis de subconsulta y no la cláusula VALUES . Esto no se puede utilizar ya que los datos que se insertarán aún no existen en la base de datos.

No he podido encontrar ninguna referencia a que Java pueda usar el estilo de matriz de host que usa Pro * C.

Además, estamos investigando la carga de tablas externas o el cargador SQL * y apreciamos que estas herramientas sean capaces de cargar rutas directas, pero esta pregunta realmente trata de obtener una respuesta definitiva sobre si la inserción de rutas directas es incluso posible desde Java. Comprender las limitaciones de la API de Java es útil no solo para este proyecto sino también para proyectos futuros.

Entonces, para reiterar la pregunta, ¿hay alguna forma de que pueda hacer uso de la inserción de ruta directa desde Java?

Pregunta relacionada: