2012-02-07 27 views
1

Hibernateを使用している問題をデバッグするために、バッチ処理されていないステートメントを代わりに使用するために、Hibernateのバッチ挿入/更新メカニズムを無効にしたいと思います。Hibernateバッチ処理を無効にする

私はhibernate.jdbc.batch_size=1を設定することができることを知っているが、まだ1

のバッチサイズで、通常のバッチ処理コードを通過することは、完全にバッチ処理をオフにする方法はありますか? the documentationからストレート

答えて

1

間の値をお勧めします。残念ながら、それを行う簡単な方法はありません。しかし...私はHibernateのソースコードをチェックしており、Hibernateは更新/挿入操作を実行する前に複数の条件をチェックしているようです。バッチを使用するかどうかを決定する。 AbstractEntityPersister#updateメソッドを見てください。このような行があるはずです:あなたが行うことができます

final boolean useBatch = j == 0 && expectation.canBeBatched() && isBatchable(); //note: updates to joined tables can't be batched... 

ことの一つは、常にfalseを返します独自の実装によってisBatchable()メソッドを置き換えることです。デフォルトでは、次のようになります。

public boolean isBatchable() { 
     return optimisticLockMode()==Versioning.OPTIMISTIC_LOCK_NONE || 
      (!isVersioned() && optimisticLockMode()==Versioning.OPTIMISTIC_LOCK_VERSION) || 
      getFactory().getSettings().isJdbcBatchVersionedData(); 
    } 

したがって、あなたが次のいずれかの方法を選択できます。

  • は、Hibernateのソースコード
  • は、設定を微調整置き換えるEntityPersister
  • の独自の実装を作成しますプロパティーhibernate.jdbc.batch_versioned_data = falseを設定し、OPTIMISTIC_LOCK_ALLを持つすべてのエンティティのロック・モードを設定します。

私が前に言ったように、単純ではありません。

2

hibernate.jdbc.batch_size:非ゼロ値は 更新HibernateがJDBC2バッチの使用を可能にします。例えば私の知る限り、あなたはHibernateがPreparedStatementの#addBatch(SQL)メソッドを呼び出さない(代わりに、すべての操作のための専用の文インスタンスを使用)したい理解として5と30

+0

まあ、hibernate.jdbc.batch_sizeを削除したり、hibernate.jdbc.batch_size = 0に設定しても、バッチ処理が無効になるわけではありません。 –

+0

org.hibernate.cfg.SettingsFactory.createBatcherFactory(Properties、int)にブレークポイントを設定し、どの値が渡され、どのバッチャーファクトリが使用されるかを確認します。 org.hibernate.cfg.SettingsFactory.buildSettings(Properties)で同じことを行います。 Hibernateがバグを持っているか、あなたの設定があなたの考えではありません。 –

+0

@Thilo 'がtrueであることを確認してください。 Barett

関連する問題