2009-07-30 56 views
5

我使用Hibernate支持的JPA作爲我的持久層。我有一個多線程進程,它彙集Soap調用的數據,然後將一行存儲在數據庫中。該過程通常最終插入大約700行,需要大約1 - 3小時,Soap調用是主要瓶頸。如何防止JPA插入鎖定數據庫表?

在整個過程中,我插入的表鎖定並且不會及時返回select語句。

這裏是SQL服務器錯誤:

Error Message: Lock request time out period exceeded.

如何避免在這個漫長的過程,我鎖定的數據庫表?

回答

1

你是否插入了所有的700行,與相同的事務?

您的交易邊界在哪裏?如果你可以降低你的交易限制,也就是隻交易實際的插入操作,所以鎖定很簡單。

如果您需要將整個進程設置爲原子化,則可以將其寫入臨時表,然後執行批量插入(快速)以將其插入主表中。

2

您可能需要更改隔離級別。

下面是一些信息: http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels

它談到了不同的隔離級別,以及他們可以幫助防範。這樣做的一般方法是從strictist開始,然後在需要更好的響應時間時降低,同時牢記數據完整性/錯誤讀取的要求。

編輯

Spring的事務級別用於抽象JDBC(或其他)事務隔離級別的事務管理器。它們在TransactionDefinition類中定義,並且是靜態成員。

TransactionDefinition.ISOLATION_DEFAULT 
Default isolation 

TransactionDefinition.ISOLATION_READ_UNCOMMITTED 
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions 

TransactionDefinition.ISOLATION_READ_COMITTED 
Cannot read uncommitted data 

TransactionDefinition.ISOLATION_REPEATABLE_READ 
Ensures repeatable reads 

TransactionDefinition.ISOLATION_SERIALIZABLE 
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially. 

還有事務傳播級別。您可能正在使用純讀取事務,這可能是矯枉過正的 - 讀取操作不需要事務處理,寫入操作應始終在其周圍進行事務處理。 TransactionDefinition中的傳播級別也是確定的。這些通常在彈簧接線文件中用於定義特定呼叫的序列化和傳播。如果你有一個接線示例,我可能會提供更多提示/信息。

+0

如果您使用的是Spring事務管理器,則當您設置事務DAO時,可以爲每個事務性調用設置隔離級別。 – aperkins 2009-07-30 20:03:51

+0

真的,你可以擴展一下或者指向一篇文章的方向嗎? – 2009-07-30 20:06:11

+0

請注意,我從Rob Harrop和Jan Machacek的參考書「Pro Spring」中獲得的所有Spring信息。雖然是一本非常乾燥的書,但它對於Spring來說是一個非常好的參考資料,它的索引非常好。這是終於使我的交易「點擊」的書 - 雖然它花了一段時間:) – aperkins 2009-07-30 20:17:22

0

您是否試圖在一個JPA事務中創建700個soap請求?不要這樣做。 :-)

相關問題