java操作数据库挂死_如何在Java程序中处理数据库超时与死?
什么是數(shù)據(jù)庫鎖定與死鎖
鎖定(Locking)發(fā)生在當一個事務(wù)獲得對某一資源的“鎖”時,這時,其他的事務(wù)就不能更改這個資源了,這種機制的存在是為了保證數(shù)據(jù)一致性;在設(shè)計與數(shù)據(jù)庫交互的程序時,必須處理鎖與資源不可用的情況。鎖定是個比較復(fù)雜的概念,仔細說起來可能又需要一大篇,所以在本文中,只把鎖定看作是一個臨時事件,這意味著如果一個資源被鎖定,它總會在以后某個時間被釋放。
而死鎖發(fā)生在當多個進程訪問同一數(shù)據(jù)庫時,其中每個進程擁有的鎖都是其他進程所需的,由此造成每個進程都無法繼續(xù)下去。
如何避免鎖
我們可利用事務(wù)型數(shù)據(jù)庫中的隔離級別機制來避免鎖的創(chuàng)建,正確地使用隔離級別可使程序處理更多的并發(fā)事件(如允許多個用戶訪問數(shù)據(jù)),還能預(yù)防像丟失修改(Lost Update)、讀“臟”數(shù)據(jù)(Dirty Read)、不可重復(fù)讀(Nonrepeatable Read)及“虛”(Phantom)等問題。
表1:DB2的隔離級別與其對應(yīng)的問題現(xiàn)象
在只讀模式中,就可以防止鎖定發(fā)生,而不用那些未提交只讀隔離級別的含糊語句。一條SQL語句當使用了下列命令之一時,就應(yīng)該考慮只讀模式了:
1、JOIN
2、SELECT DISTINCT
3、GROUP BY
4、ORDER BY
5、UNION
6、UNION ALL
7、SELECT
8、FOR FETCH ONLY (FOR READ ONLY)
9、SELECT FROM
如果包含上述任一命令,可以說你的SQL語句有歧義性,因此,鎖可能就是造成其中資源問題的源頭。
另外,以下是一些可降低鎖數(shù)目的建議:
1、 將CURRENTDATA設(shè)為NO。這條命令告訴DB2模糊光標為只讀。
2、 在適當?shù)臅r候,盡可能使用User Uncommitted Read(用戶未提交的讀)。
3、 盡可能關(guān)閉所有光標。
4、 有一個正確的提交策略。確保程序不再使用資源時就立即釋放它。
如何處理死鎖與超時
在程序中使用重試邏輯,可處理以下三種SQL錯誤代碼:
1、 904:返回這個代碼表示一條SQL語句是因為已達到資源限度而結(jié)束的。程序中可提交或回滾更改,并執(zhí)行重試邏輯。
2、 911:程序收到這個SQL代碼,表示因為沒有為鎖列表分配足夠的內(nèi)存,現(xiàn)在已達到數(shù)據(jù)庫的最大鎖數(shù)目。
3、 912:程序收到這個SQL代碼,表示死鎖或超時,依照904中的方法來解決。
全部
總結(jié)
以上是生活随笔為你收集整理的java操作数据库挂死_如何在Java程序中处理数据库超时与死?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 类一定要声明成public_类
- 下一篇: Java自动部署maven_Maven+