爲了調試我們使用Hibernate的問題,我想禁用Hibernate的批量插入/更新機制來使用非批處理語句。禁用Hibernate批處理
我知道我可以設置hibernate.jdbc.batch_size=1
,但仍然通過正常的配料代碼都與1
批處理大小,有什麼辦法可以徹底關閉批處理?
爲了調試我們使用Hibernate的問題,我想禁用Hibernate的批量插入/更新機制來使用非批處理語句。禁用Hibernate批處理
我知道我可以設置hibernate.jdbc.batch_size=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();
}
因此,您可以選擇以下方法之一:
正如我之前所說的不簡單但可能的。
hibernate.jdbc.batch_size:非零值使得能夠使用JDBC2一批由Hibernate 更新。例如推薦值介於5和30之間
好吧,除了刪除hibernate.jdbc.batch_size或設置hibernate.jdbc.batch_size = 0不禁用批處理。 – 2012-02-07 14:04:34
在org.hibernate.cfg.SettingsFactory.createBatcherFactory(Properties,int)中放置一個斷點,以查看哪個值傳遞以及它使用哪個batcher工廠。在org.hibernate.cfg.SettingsFactory.buildSettings(Properties)中執行相同的操作。 Hibernate有一個bug,或者你的配置不是你想象的那個。 – 2012-02-07 14:29:05
@Thilo確保你有' true ' –
Barett
2015-01-22 17:15:27