JConnect(を使用ENABLE_BULK_LOAD
)を介してSybase ASEに一括挿入する例を誰かが提供できますか?
私はインターネットを精査しましたが、何も見つかりませんでした。
JConnect(を使用ENABLE_BULK_LOAD
)を介してSybase ASEに一括挿入する例を誰かが提供できますか?
私はインターネットを精査しましたが、何も見つかりませんでした。
Sybase のエンジニアの 1 人と連絡を取り、コード サンプルを提供してくれました。だから、私は自分の質問に答えることができます。
コードサンプルはかなり大きいので、基本的にここに概要を示します...これは、事前に初期化された変数が多数あることを前提としていますが、それ以外の場合は数百行になります。興味のある人はアイデアを得る必要があります。これにより、完全な世界で 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〜1000行のバッチで送信することに比べて改善は見られませんでした。私たちは回避しました:*ビッグストリングメソッド[500バッチで5000行]:1716ms =〜2914行/秒。(これはたわごとです!)。
私たちのデータベースは、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
)
account_transaction_id(pk)、account_id、DATE、contract_idに4つのインデックスがあります。
最初にいくつかのコメントを投稿すると思ったのですが、以下を使用して接続しています。
jdbc:sybase:Tds:40.1.1.2:5000/ikp?EnableBatchWorkaround=true;ENABLE_BULK_LOAD=true
上記の.addBatch構文も試しましたが、java StringBuilderを使用してSQLでバッチを手動で構築し、それを1つのexecuteステートメントでプッシュするよりもわずかに遅くなりました。insertステートメントの列名を削除すると、パフォーマンスが驚くほど大幅に向上しました。実際にパフォーマンスに影響を与えたのはそれだけのようでした。Enable_bulk_loadパラメータはまったく効果がないようで、EnableBatchWorkaroundも効果がなかったため、DYNAMIC_PREPARE = falseを試しました。これは有望に聞こえますが、何もしないようです。
これらのパラメータを実際に機能させるための助けは素晴らしいでしょう!言い換えれば、それらが有効であることを確認するために実行できるテストはありますか?mysqlは、同じスキーマで同じ「大きな文字列メソッド」を使用して1秒あたり16,000行のように動作するため、このパフォーマンスはsybaseの境界を押し上げることに近いとは言えません。
チアーズロッド
Chris Kannon が提供するサンプルを機能させるには、まず自動コミット モードを無効にすることを忘れないでください。
dbConn.setAutoCommit(false);
dbConn.commit() の前に次の行を配置します。
pstmt.executeBatch();
そうしないと、この手法は挿入を遅くするだけです。
Java でこれを行う方法はわかりませんが、LOAD TABLE SQL ステートメントを使用してテキスト ファイルを一括読み込みできます。JConnect 経由で Sybase ASA を使用して実行しました。
バッチ更新のサポート
バッチ更新を使用すると、Statement オブジェクトは複数の更新コマンドを 1 つのユニット (バッチ) として基になるデータベースに送信して、一緒に処理することができます。
注:バッチ更新を使用するには、jConnect インストール ディレクトリの下の sp ディレクトリにある SQL スクリプトを更新する必要があります。章
Statement、PreparedStatement、および CallableStatement でバッチ更新を使用する例については、sample (jConnect 4.x) および sample2 (jConnect 5.x) サブディレクトリにあるBatchUpdates.java を参照してください。jConnect は、バッチで動的な PreparedStatements もサポートします。
参照:
http://download.sybase.com/pdfdocs/jcg0420e/prjdbc.pdf
.
その他のバッチ更新リソース
http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html