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