2013-04-05 38 views
2

我接管了一個公司的Java Web應用程序,該應用程序的代碼爲30k行。系統中有大約20個用戶。該應用程序最初做了原始的jdbc sql查詢。我已將一些SQL轉換爲休眠狀態,但由於時間和預算限制,我沒有將其全部轉換。我的想法是,我可以做兩個數據庫交互方法(休眠和原始jdbc)的混合,而我逐漸將應用程序遷移到所有休眠。它使用c3p0連接池。它使用兩個池;一個用於休眠,一個用於原始jdbc查詢。有一些原始的jdbc更新和插入查詢,但它們現在全部使用hibernate的鉤子session.doWork(Work work)。數據庫是Microsoft SQL Server '08 R2。休眠和原始JDBC應用程序混合鎖定

我們使用這種方法遇到的問題似乎總是表現爲應用程序鎖定。在過去一個月裏,我通過解決明顯的問題,能夠減少鎖定的頻率。我現在正處在一個問題上,原因並不那麼明顯,我的老闆和我懷疑我們的方法或配置有什麼根本性的錯誤可以完全解決這個問題。

一件事是令人困惑我的是,如果這些拘留所是DB死鎖,線程轉儲似乎只是表明寫阻塞讀。但是,事務隔離級別是讀取提交的,那麼爲什麼寫塊會被讀取?

有什麼建議可以給你?有更好的調試分析的建議嗎?

這裏是從我的persistence.xml文件屬性

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/> 
<property name="hibernate.archive.autodetection" value="class, hbm"/> 
<property name="hibernate.c3p0.min_size" value="20" /> 
<property name="hibernate.c3p0.max_size" value="300" /> 
<property name="hibernate.c3p0.timeout" value="300" /> 
<property name="hibernate.c3p0.max_statements" value="50" /> 
<property name="hibernate.c3p0.idle_test_period" value="3000" /> 

我使用的是默認C3P0配置爲原始JDBC選擇查詢

回答

2

我想你應該已經解決了這個問題但如果沒有,你可以檢查此鏈接了http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/transactions.html

可以通過檢查你的應用程序沒有長開的交易開始。

+0

我不確定問題已經解決了,但截至上週,我認爲這可能是。上週我們進行了新的應用程序監控。我發現了一些長期運行的交易,這讓我想到了更多需要解決的問題。從那以後,該應用程序似乎變得更好了。感謝您的回答! – 2013-05-28 14:38:54

0

我認爲你的問題是更多的交易和休眠您的代碼打開代理對象,也許你有更多的邏輯事務損壞或沒有關閉。

Hibernate在從數據庫檢索到邏輯事務的單個記錄上創建代理對象。如果您在另一個事務中更改此記錄,或者將這些代理與它們的事務同步,或者hibernate運行更多刷新操作來更新這些代理(如果它們的事務處於打開狀態)。

現在,我的問題,來幫助你,是這些:

  • 你可以開發新的代碼?如果不是,我建議離開Hibernate。

如果是:

  • 我建議建立一箇中間層來管理數據層和所有的代碼之間的邏輯事務。

  • 使用一些IDE與JPA 2.0支持創建由數據庫逆向工程的對象。