2012-02-07 49 views
1

爲了調試我們使用Hibernate的問題,我想禁用Hibernate的批量插入/更新機制來使用非批處理語句。禁用Hibernate批處理

我知道我可以設置hibernate.jdbc.batch_size=1,但仍然通過正常的配料代碼都與1

批處理大小,有什麼辦法可以徹底關閉批處理?

回答

1

據我所知,您希望避免通過Hibernate調用PreparedStatement#addBatch(sql)方法(而是針對每個操作使用專用語句實例)。不幸的是,有沒有簡單的方法來做到這一點。但是...我已經檢查過Hibernate源代碼,看起來Hibernate在運行更新/插入操作之前檢查了多個條件。它決定是否使用批次。看看AbstractEntityPersister#更新的方法。應該有這樣一行:

,你可以做
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(); 
    } 

因此,您可以選擇以下方法之一:

  • 創建自己的實現EntityPersister的
  • 更換Hibernate的源代碼
  • 調整配置通過設置屬性hibernate.jdbc.batch_versioned_data = false,併爲每個必須爲OPTIMISTIC_LOCK_ALL的實體設置鎖定模式。

正如我之前所說的不簡單但可能的。

2

直從the documentation

hibernate.jdbc.batch_size:非零值使得能夠使用JDBC2一批由Hibernate 更新。例如推薦值介於5和30之間

+0

好吧,除了刪除hibernate.jdbc.batch_size或設置hibernate.jdbc.batch_size = 0不禁用批處理。 – 2012-02-07 14:04:34

+0

在org.hibernate.cfg.SettingsFactory.createBatcherFactory(Properties,int)中放置一個斷點,以查看哪個值傳遞以及它使用哪個batcher工廠。在org.hibernate.cfg.SettingsFactory.buildSettings(Properties)中執行相同的操作。 Hibernate有一個bug,或者你的配置不是你想象的那個。 – 2012-02-07 14:29:05

+0

@Thilo確保你有' true' – Barett 2015-01-22 17:15:27