2

以前は、Hibernate でバッチ挿入を機能させようとしていました。私はすべてを試しました:設定のために、batch_size(50)、order_inserts(true)、order_updates(true)、use_second_level_cache(false)、use_query_cache(false)を設定しました。私が使用したセッションではsetCacheMode(CacheMode.IGNORE)setFlushMode(FlushMode.MANUAL). それでも、MySQL クエリ ログは、各挿入が別々に行われていることを示していました。

rewriteBatchedStatements=true機能した唯一のことは、JBDC接続文字列の設定でした。私のアプリケーションは任意の JBDC データベースをサポートするはずであり、DB 固有の最適化を回避しようとしているので、これは心配です。

MySQLドライバーがデフォルトでバッチステートメントをサポートしていないため、休止状態が実際にバッチステートメントを使用できない唯一の理由はありますか? 他のドライバーはどうですか?バッチ挿入をサポートできるように、接続文字列にオプションを追加する必要がありますか? 特定のデータベースが必要な場合は、SQL サーバー、sqlite、Postgres などを考えてください。

4

2 に答える 2

2

機能しない理由の 1 つは、Identityid 生成戦略を使用すると、休止状態がバッチ処理を無効にすることです。

また、MySQL は、書き換えオプションを有効にしない限り、他のデータベースと同じ方法で JDBC バッチ準備済みステートメントをサポートしていません。

このフラグをオンにしても問題はないと思いますが、別のデータベース用にアプリケーションをセットアップしている場合は、とにかく方言、ドライバー名などの設定を変更する必要があります。これは一部であるためです。 JDBC接続文字列の場合、構成から分離されます。

基本的に、あなたは正しいことをしていると思います。

于 2013-03-22T07:27:23.907 に答える
0

バッチ挿入 (または一括挿入) は SQL 標準の一部であるため、Hibernate などの ORM フレームワークはそれをサポートおよび実装しています。第 13 章バッチ処理Hibernate/MySQL 一括挿入の問題を参照してください。

基本的に、適切なサイズに指定された変数を介して JDBC バッチ サイズを設定する必要がありますhibernate.jdbc.batch_sizeflush()また、とでバッチ トランザクションを終了することも忘れないでくださいclear()

于 2013-03-25T10:06:58.700 に答える