Sybase JConnect:ENABLE_BULK_LOAD の使用法
-
22-09-2019 - |
質問
誰かが JConnect 経由での一括挿入の例を提供できますか ( ENABLE_BULK_LOAD
) Sybase ASE に?
インターネットを調べましたが、何も見つかりませんでした。
解決
私は、Sybaseのエンジニアの1と連絡を持って、彼らは私のコードサンプルを提供しました。だから、私は自分の質問に答えるために取得ます。
コードサンプルはかなり大きいよう...これは、事前に初期化された変数の多くを前提としていますが、それ以外の場合は数百行になります。基本的にはここで、ランダウンです。興味のある人は、アイデアを得る必要があります。これは22Kの挿入(とにかくSybaseのあたりなど)完璧な世界で二番目まで得ることができます。
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
}
他のヒント
あなたのアドバイスのほとんどを、以下の後、私たちはどんな改善がオーバー単に大規模な文字列を作成し、〜のバッチで、周囲のトランザクションに100-1000rows渡っていることを送信し表示されませんでした。私たちは、暇: *ビッグ文字列メソッド[500batchesで5000rows]:1716ms =〜毎秒2914rows。 (これはたわごとです!)。
私たちのDBは、1つのCPU(i7の下)を使用して仮想ホスト上に座っているとテーブルスキーマは、次のとおりです。
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
)
4つのaccount_transaction_idのインデックス(PK)、ACCOUNT_ID、DATE、contract_idと。
ただ、私が最初に私たちが使用して接続しているいくつかのコメントを投稿するだろうと思っます:
jdbc:sybase:Tds:40.1.1.2:5000/ikp?EnableBatchWorkaround=true;ENABLE_BULK_LOAD=true
私たちも.addBatchの構文は、上述しようとしましたが、それは遅くなるだけで、手動でSQLのバッチを構築するためのJavaのStringBuilderを使用して、ちょうど1文を実行に渡ってそれをプッシュするよりもわずかでした。 INSERT文で列名を削除すると、私たちに実際にパフォーマンスを行なうことを唯一のものと思われた驚くほど大きなパフォーマンスの向上を与えました。 Enable_bulk_loadのparamはすべてでそれを達成するために思えたりEnableBatchWorkaroundやっていなかったとして、私たちもまた、有望な響きが、偽のは何もしていないようでした= DYNAMIC_PREPAREを試します。
すべてのヘルプこれらのパラメータは、実際に機能してきは素晴らしいことです!言い換えれば、我々は、彼らが有効であることを確認するために実行可能性のテストがあるのですか?私はまだ、このパフォーマンスが近く、同じスキーマと同じ「大きな文字列方式」を使用して行い、より毎秒16,000rowsのようなボックスのmysqlのようSYBASEの境界を押し出すのではないことを確信しています。
乾杯 ロッド
クリス観音加工により提供されたサンプルを得るために、最初のコミットモードを無効autoに忘れてはいけません
dbConn.setAutoCommit(false);
そしてdbConn.commit()の前に、以下の行を置きます:
pstmt.executeBatch();
それ以外の場合、この手法意志だけ減速挿入ます。
Javaでこれを行う方法を知っていますが、LOAD TABLEのSQLステートメントを使用して、バルク・ロード・テキストファイルのことができないでください。当社では、jConnect上のSybase ASAでそれをやっています。
バッチアップデートのサポート
バッチ更新により、ステートメントオブジェクトは、複数の更新コマンドを1つのユニット(バッチ)として、一緒に処理するための基礎となるデータベースに送信できます。
注記: バッチ更新を使用するには、JConnectインストールディレクトリの下のSPディレクトリのSQLスクリプトを更新する必要があります。章
サンプルの BatchUpdates.java を参照してください。 (jconnect 4.x)およびsample2(jconnect 5.x)サブディレクトリは、ステートメント、準備、およびcallablestatementを使用してバッチ更新を使用する例です。jConnect はバッチでの動的な PreparedStatement もサポートします。
参照:
http://download.sybase.com/pdfdocs/jcg0420e/prjdbc.pdf
.
その他のバッチ更新リソース
http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html