成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java程序中解決數據庫超時與死鎖

開發 后端
Java程序中解決數據庫超時與死鎖,每個使用關系型數據庫的程序都可能遇到數據死鎖或不可用的情況,而這些情況需要在代碼中編程來解決。本文主要介紹與數據庫事務死鎖等情況相關的重試邏輯概念。

Java程序中解決數據庫超時與死鎖,每個使用關系型數據庫的程序都可能遇到數據死鎖或不可用的情況,而這些情況需要在代碼中編程來解決;本文主要介紹與數據庫事務死鎖等情況相關的重試邏輯概念,此外,還會探討如何避免死鎖等問題,文章以DB2(版本9)與Java為例進行講解。

簡介

每個使用關系型數據庫的程序都可能遇到數據死鎖或不可用的情況,而這些情況需要在代碼中編程來解決;本文主要介紹與數據庫事務死鎖等情況相關的重試邏輯概念,此外,還會探討如何避免死鎖等問題,文章以DB2(版本9)與Java為例進行講解。

什么是數據庫鎖定與死鎖

鎖定(Locking)發生在當一個事務獲得對某一資源的“鎖”時,這時,其他的事務就不能更改這個資源了,這種機制的存在是為了保證數據一致性;在設計與數據庫交互的程序時,必須處理鎖與資源不可用的情況。鎖定是個比較復雜的概念,仔細說起來可能又需要一大篇,所以在本文中,只把鎖定看作是一個臨時事件,這意味著如果一個資源被鎖定,它總會在以后某個時間被釋放。而死鎖發生在當多個進程訪問同一數據庫時,其中每個進程擁有的鎖都是其他進程所需的,由此造成每個進程都無法繼續下去。

如何避免鎖

我們可利用事務型數據庫中的隔離級別機制來避免鎖的創建,正確地使用隔離級別可使程序處理更多的并發事件(如允許多個用戶訪問數據),還能預防像丟失修改 (Lost Update)、讀“臟”數據(Dirty Read)、不可重復讀(Nonrepeatable Read)及“虛”(Phantom)等問題。

在只讀模式中,就可以防止鎖定發生,而不用那些未提交只讀隔離級別的含糊語句。一條SQL語句當使用了下列命令之一時,就應該考慮只讀模式了:

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語句有歧義性,因此,鎖可能就是造成其中資源問題的源頭。

另外,以下是一些可降低鎖數目的建議:

1、 將CURRENTDATA設為NO。這條命令告訴DB2模糊光標為只讀。

2、 在適當的時候,盡可能使用User Uncommitted Read(用戶未提交的讀)。

3、 盡可能關閉所有光標。

4、 有一個正確的提交策略。確保程序不再使用資源時就立即釋放它。

如何處理死鎖與超時

在程序中使用重試邏輯,可處理以下三種SQL錯誤代碼:

1、 904:返回這個代碼表示一條SQL語句是因為已達到資源限度而結束的。程序中可提交或回滾更改,并執行重試邏輯。

2、 911:程序收到這個SQL代碼,表示因為沒有為鎖列表分配足夠的內存,現在已達到數據庫的最大鎖數目。

3、 912:程序收到這個SQL代碼,表示死鎖或超時,依照904中的方法來解決。

以下是一段Java代碼,其捕捉返回的-911、-912、-904代碼,并進行重試:

 

  1. for (int i = 0; i < MAX_RETRY_ATTEMPTS; i++) {  
  2. //以下代碼模擬一次事務  
  3. try {  
  4. stmt = conn.createStatement();  
  5. System.out.println("Transaction started...");  
  6. stmt.executeUpdate("UPDATE 1..."); //SQL語句1  
  7. stmt.executeUpdate("UPDATE 2..."); // SQL語句2  
  8. stmt.executeUpdate("UPDATE 3..."); // SQL語句3  
  9. stmt.executeUpdate("UPDATE 3..."); // SQL語句4  
  10. //提交所有更改  
  11. conn.commit();  
  12. System.out.println("事務已完成。");  
  13. //確保只運行了一次。  
  14. i = MAX_RETRY_ATTEMPTS;  
  15. catch (SQLException e) {  
  16. /**  
  17. *如果返回的SQL代碼為-911,回滾會自動完成,程序回滾至前一次的提交狀態。  
  18. *程序將進行重試。  
  19. */ 
  20. if (-911 == e.getErrorCode()) {  
  21. //等待RETRY_WAIT_TIME  
  22. try {  
  23. Thread.sleep(RETRY_WAIT_TIME);  
  24. catch (InterruptedException e1) {  
  25. //即使休眠被打斷,但仍要重試。  
  26. System.out.println("休眠被打斷。");  
  27. }  
  28. }  
  29. /**  
  30. *如果返回的SQL代碼為-912,表示死鎖及超時。  
  31. *如果是-904,代表已達到資源限度。  
  32. *在這種情況下,程序將回滾并進行重試。  
  33. */ 
  34. else if (-912 == e.getErrorCode() || -904 == e.getErrorCode()) {  
  35. try {  
  36. //需要回滾  
  37. conn.rollback();  
  38. catch (SQLException e1) {  
  39. System.out.println("無法回滾。"; color:black’> + e);  
  40. }  
  41. try {  
  42. //等待RETRY_WAIT_TIME  
  43. Thread.sleep(RETRY_WAIT_TIME);  
  44. catch (InterruptedException e1) {  
  45. //即使休眠被打斷,但仍要重試。  
  46. System.out.println("休眠被打斷。" + e1);  
  47. }  
  48. else {  
  49. //如果是其他錯誤,就不進行重試。  
  50. i = MAX_RETRY_ATTEMPTS;  
  51. System.out.println("有錯誤發生,錯誤代碼:" 
  52. + e.getErrorCode() + " SQL狀態:" 
  53. +e.getSQLState() + "其他信息:" + e.getMessage());  

 

從上面也可看到,程序對死鎖、超時、最大鎖數目將會進行MAX_RETRY_ATTEMPTS次重試;其次,當“最大鎖數目”的情況發生時 (-911),程序不必手工進行回滾,因為此時的回滾是自動完成的;最后,無論何時返回-911、-904、-912代碼,程序應在下次重試前等待 RETRY_WAIT_TIME一段時間。
 

【編輯推薦】

  1. JAVA語言關于字符串替換的思考
  2. Java數據庫程序中的存儲過程設計
  3. java/.net語言及IDE簡易對比
  4. 淺談Overload和Override的區別
  5. 靜態變量與非靜態變量的區別
責任編輯:于鐵 來源: 幫考網
相關推薦

2009-03-31 09:50:15

死鎖超時Java

2011-03-11 17:27:33

Java數據庫超時

2019-05-13 08:24:58

數據庫MySQLInnoDB

2023-09-13 14:52:11

MySQL數據庫

2009-03-24 10:45:39

MySQL5連接超時數據庫

2010-04-26 13:23:49

Oracle數據庫

2024-06-21 09:37:57

2024-08-19 11:45:18

2011-06-03 10:50:27

Java

2023-09-21 23:08:36

MySQL數據庫死鎖

2011-03-08 09:27:34

SQL Server數死鎖

2010-11-29 10:11:05

Sybase數據庫死鎖

2009-03-30 10:56:58

SQL Server數據庫死鎖數據庫

2017-10-25 15:27:52

MySQL數據庫超時設置

2011-08-10 15:46:29

數據庫

2010-07-06 14:40:15

解決SQL Serve

2009-03-31 11:57:52

2011-04-27 09:25:13

MySQL字符型數據

2011-03-28 13:11:18

MySQL數據庫安全

2024-07-05 09:19:52

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草新在线| 欧美日韩三级视频 | 成人黄色av网址 | 久久福利电影 | 久久中文字幕电影 | 一区二区三区四区在线视频 | 国产在线精品一区二区三区 | 91视频导航 | 在线播放精品视频 | 成人欧美一区二区三区黑人孕妇 | 成人国产精品入口免费视频 | 亚洲成人免费 | 久久久久国产 | 亚洲福利在线观看 | av中文在线 | 色综合一区二区 | 欧美日韩在线国产 | 精品国产一区久久 | 97精品一区二区 | 国产激情一区二区三区 | 免费黄色片在线观看 | 精品三区 | 国内自拍第一页 | 欧美精品乱码久久久久久按摩 | 成人免费网站www网站高清 | 免费一区 | 成人无遮挡毛片免费看 | 亚洲天堂精品一区 | 亚洲免费影院 | 欧美a视频 | 欧美日韩中文字幕 | 日韩一区二区福利视频 | 久久婷婷国产麻豆91 | 中文字幕亚洲欧美日韩在线不卡 | 天天操 天天操 | 亚洲国产成人精品女人 | 久久精品中文 | 成人高清在线 | 亚洲 欧美 日韩在线 | 久久久久国产精品一区二区 | 精品久久久久久久久久 |