Domanda

Qualcuno là fuori può fornire un esempio di inserimenti in blocco tramite JConnect (con ENABLE_BULK_LOAD) a Sybase ASE?

Ho setacciato internet e non ho trovato nulla.

È stato utile?

Soluzione

sono entrato in contatto con uno degli ingegneri di Sybase e mi ha fornito un esempio di codice. Così, riesco a rispondere alla mia domanda.

In sostanza Ecco una carrellata, come il codice di esempio è abbastanza grande ... Questo presuppone un sacco di variabili pre inizializzati, ma per il resto sarebbe a poche centinaia di righe. Chi fosse interessato dovrebbe avere l'idea. Ciò può produrre fino a 22K inserimenti al secondo in un mondo perfetto (come da Sybase in ogni caso).

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
}

Altri suggerimenti

Dopo aver seguito la maggior parte dei tuoi consigli non abbiamo riscontrato alcun miglioramento rispetto alla semplice creazione di una stringa enorme e all'invio in batch di circa 100-1000 righe con una transazione circostante.siamo andati in giro:*Metodo Big String [5000 righe in 500 lotti]:1716 ms = ~ 2914 righe al secondo.(questa è una merda!).

Il nostro db si trova su un host virtuale con una CPU (i7 sotto) e lo schema della tabella è:

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 quattro indici su account_transaction_id (pk), account_id, DATE, contract_id.

Ho pensato solo di pubblicare prima alcuni commenti, ci stiamo connettendo utilizzando:

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

abbiamo anche provato la sintassi .addBatch descritta sopra, ma era leggermente più lenta rispetto al semplice utilizzo di Java StringBuilder per creare manualmente il batch in SQL e quindi inserirlo semplicemente in un'istruzione di esecuzione.La rimozione dei nomi delle colonne nell'istruzione insert ci ha dato un aumento delle prestazioni sorprendentemente ampio che sembrava essere l'unica cosa che effettivamente ha influenzato le prestazioni.Poiché il parametro Enable_bulk_load non sembrava avere alcun effetto e nemmeno EnableBatchWorkaround, abbiamo provato anche DYNAMIC_PREPARE=false che sembrava promettente ma non sembrava fare nulla.

Qualsiasi aiuto per far funzionare effettivamente questi parametri sarebbe fantastico!In altre parole, ci sono dei test che potremmo eseguire per verificare che siano effettivi?Sono ancora convinto che questa prestazione non sia vicina a superare i limiti di sybase poiché mysql fuori dagli schemi fa più di 16.000 righe al secondo utilizzando lo stesso "metodo big string" con lo stesso schema.

Salone

Al fine di ottenere il campione fornito da Chris Kannon di lavoro, non dimenticate di disattivare la modalità automatica commettere prima:

dbConn.setAutoCommit(false);

E inserire la seguente riga prima di dbConn.commit ():

pstmt.executeBatch();

Altrimenti questa tecnica sarà solo rallentamento l'inserimento.

Non so come fare questo in Java, ma è possibile i file di testo di massa a vuoto con un'istruzione LOAD TABLE SQL. L'abbiamo fatto con Sybase ASA sopra JConnect.

supporto per gli aggiornamenti batch

aggiornamenti batch permettono un oggetto Normativa per inviare più comandi di aggiornamento come un'unità (batch) in un database sottostante per l'elaborazione insieme.

Nota: per utilizzare gli aggiornamenti in batch, è necessario aggiornare gli script SQL nella directory sp sotto la vostra directory di installazione jConnect. CAPITOLO

Vedere BatchUpdates.java nel campione (jConnect 4.x) e sample2 (jConnect 5.x) sottodirectory per un esempio di utilizzo aggiornamenti batch con la dichiarazione, PreparedStatement e CallableStatement. jConnect supporta anche PreparedStatements dinamici in batch.

Riferimento:

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

.

Altre risorse batch update

http: // java .sun.com / j2se / 1.3 / docs / guide / jdbc / spec2 / jdbc2.1.frame6.html

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top