Pregunta

¿Alguien puede proporcionar un ejemplo de inserciones masivas a través de JConnect (con ENABLE_BULK_LOAD) a Sybase ASE?

Busqué en Internet y no encontré nada.

¿Fue útil?

Solución

Me puse en contacto con uno de los ingenieros de Sybase y me proporcionaron un ejemplo de código. Por lo tanto, tengo la oportunidad de responder a mi propia pregunta.

Básicamente aquí está un resumen, como el ejemplo de código es bastante grande ... Esto supone una gran cantidad de variables inicializadas antes, pero por lo demás sería unos pocos cientos de líneas. Cualquier persona interesada debe tener la idea. Esto puede producir hasta 22K inserciones por segundo en un mundo perfecto (según Sybase todos modos).

SybDriver sybDriver = (SybDriver) Class.forName("com.sybase.jdbc3.jdbc.SybDriver").newInstance();
sybDriver.setVersion(com.sybase.jdbcx.SybDriver.VERSION_6);
DriverManager.registerDriver(sybDriver);

//DBProps (after including normal login/password etc.
props.put("ENABLE_BULK_LOAD","true");

//open connection here for  sybDriver

dbConn.setAutoCommit(false);    
String SQLString = "insert into batch_inserts (row_id, colname1, colname2)\n values (?,?,?) \n";

PreparedStatement   pstmt;
try
{
   pstmt = dbConn.prepareStatement(SQLString);      
}
catch (SQLException sqle)
{
   displaySQLEx("Couldn't prepare statement",sqle);
   return;
}

for (String[] val : valuesToInsert)
{
   pstmt.setString(1, val[0]);  //row_id    varchar(30)
   pstmt.setString(2, val[1]);//logical_server varchar(30)
   pstmt.setString(3, val[2]);  //client_host varchar(30)

   try
   {
      pstmt.addBatch();
   }
   catch (SQLException sqle)
   {
      displaySQLEx("Failed to build batch",sqle);
      break;
   }
}

try {
   pstmt.executeBatch();
   dbConn.commit();
   pstmt.close();
} catch (SQLException sqle) {
   //handle
}

try {
   if (dbConn != null)
      dbConn.close();
} catch (Exception e) {
   //handle
}

Otros consejos

Después de seguir la mayoría de sus consejos, no vimos ninguna mejora con respecto a simplemente crear una cadena masiva y enviarla en lotes de ~100-1000 filas con una transacción circundante.nos desplazamos:*Método de cadena grande [5000 filas en 500 lotes]:1716 ms = ~2914 filas por segundo.(¡esto es una mierda!).

Nuestra base de datos está ubicada en un host virtual con una CPU (i7 debajo) y el esquema de la tabla es:

CREATE TABLE
archive_account_transactions
(
account_transaction_id INT,
entered_by INT,
account_id INT,
transaction_type_id INT,
DATE DATETIME,
product_id INT,
amount float,
contract_id INT NULL,
note CHAR(255) NULL
)

con cuatro índices en account_transaction_id (pk), account_id, DATE, contract_id.

Solo pensé en publicar algunos comentarios primero, nos estamos conectando usando:

jdbc:sybase:Tds:40.1.1.2:5000/ikp?EnableBatchWorkaround=true;ENABLE_BULK_LOAD=true   

También probamos la sintaxis .addBatch descrita anteriormente, pero fue un poco más lenta que simplemente usar Java StringBuilder para crear el lote en SQL manualmente y luego simplemente enviarlo en una declaración de ejecución.Eliminar los nombres de las columnas en la instrucción de inserción nos dio un aumento de rendimiento sorprendentemente grande; parecía ser lo único que realmente afectó el rendimiento.Como el parámetro Enable_bulk_load no pareció afectarlo en absoluto ni tampoco EnableBatchWorkaround, también probamos DYNAMIC_PREPARE=false, lo que parecía prometedor pero tampoco pareció hacer nada.

¡Cualquier ayuda para que estos parámetros funcionen realmente sería genial!En otras palabras, ¿hay alguna prueba que podamos realizar para verificar que estén vigentes?Todavía estoy convencido de que este rendimiento no está cerca de superar los límites de Sybase, ya que MySQL listo para usar hace más de 16,000 filas por segundo usando el mismo "método de cadena grande" con el mismo esquema.

Salud a la barra

Con el fin de obtener la muestra proporcionada por Chris Kannon de trabajo, no se olvide de desactivar el modo automático comprometerse primero:

dbConn.setAutoCommit(false);

Y colocar la siguiente línea antes dbConn.commit ():

pstmt.executeBatch();

De lo contrario esta técnica sólo se desaceleración de la inserción.

No sabe cómo hacer esto en Java, pero se puede archivos de texto a granel de carga con instrucción LOAD TABLE de SQL. Lo hicimos con Sybase ASA sobre JConnect.

ayuda para la hornada actualizaciones

Las actualizaciones por lotes permite que un objeto Statement para presentar múltiples comandos de actualización como una unidad (batch) a una base de datos subyacente para procesar juntos.

Nota: Para utilizar actualizaciones por lotes, deberá actualizar las secuencias de comandos SQL en el directorio sp bajo el directorio de instalación de jConnect. CAPÍTULO

Ver BatchUpdates.java en la muestra (4.x jConnect) y sample2 (jConnect 5.x) subdirectorios para un ejemplo del uso de actualizaciones por lotes con Norma, PreparedStatement y CallableStatement. jConnect también soporta PreparedStatements dinámicos en lotes.

Referencia:

http://download.sybase.com/pdfdocs/jcg0420e/prjdbc.pdf

http://manuals.sybase.com/onlinebooks/group-jcarc/jcg0520e/prjdbc/@ebt-link;hf=0;pt=7694?target=%25N%14_4440_START_RESTART_N%25 #X

.

Otros lotes Update Resources

http: // java .sun.com / j2se / 1,3 / docs / guía / JDBC / Esp2 / jdbc2.1.frame6.html

http://www.jguru.com/faq/view.jsp ? EID = 5079

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top