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

在Java程序中處理數據庫超時與死鎖

數據庫
在Java程序中數據庫超時或者死鎖是經常會遇到的問題,如果不懂的話,遇到這種問題就傻眼啦,就能干等著等專業人員來處理,這樣就降低了工作效率,下面就為大家介紹在Java程序中處理數據庫超時與死鎖的方法以及避免這類問題的發生。

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

  什么是數據庫鎖定與死鎖

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

  如何避免鎖

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

  隔離級別 問題現象

  丟失修改 讀“臟”數據 不可重復讀 “虛”

  可重復讀取 No No No No

  讀取穩定性 No No No Yes

  光標穩定性 No No Yes Yes

  未提交的讀 No Yes Yes Yes

  表1:DB2的隔離級別與其對應的問題現象

  在只讀模式中,就可以防止鎖定發生,而不用那些未提交只讀隔離級別的含糊語句。一條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、 有一個正確的提交策略。確保程序不再使用資源時就立即釋放它。

#p#

  如何處理死鎖與超時

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

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

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

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

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

  for (int i = 0; i < MAX_RETRY_ATTEMPTS; i++) {

  //以下代碼模擬一次事務

  try {

  stmt = conn.createStatement();

  System.out.println("Transaction started...");

  stmt.executeUpdate("UPDATE 1..."); //SQL語句1

  stmt.executeUpdate("UPDATE 2..."); // SQL語句2

  stmt.executeUpdate("UPDATE 3..."); // SQL語句3

  stmt.executeUpdate("UPDATE 3..."); // SQL語句4

  //提交所有更改

  conn.commit();

  System.out.println("事務已完成。");

  //確保只運行了一次。

  i = MAX_RETRY_ATTEMPTS;

  } catch (SQLException e) {

  /**

  *如果返回的SQL代碼為-911,回滾會自動完成,程序回滾至前一次的提交狀態。

  *程序將進行重試。

  */

  if (-911 == e.getErrorCode()) {

  //等待RETRY_WAIT_TIME

  try {

  Thread.sleep(RETRY_WAIT_TIME);

  } catch (InterruptedException e1) {

  //即使休眠被打斷,但仍要重試。

  System.out.println("休眠被打斷。");

  }

  }

  /**

  *如果返回的SQL代碼為-912,表示死鎖及超時。

  *如果是-904,代表已達到資源限度。

  *在這種情況下,程序將回滾并進行重試。

  */

  else if (-912 == e.getErrorCode() || -904 == e.getErrorCode()) {

  try {

  //需要回滾

  conn.rollback();

  } catch (SQLException e1) {

  System.out.println("無法回滾。"; color:black'> + e);

  }

  try {

  //等待RETRY_WAIT_TIME

  Thread.sleep(RETRY_WAIT_TIME);

  } catch (InterruptedException e1) {

  //即使休眠被打斷,但仍要重試。

  System.out.println("休眠被打斷。" + e1);

  }

  } else {

  //如果是其他錯誤,就不進行重試。

  i = MAX_RETRY_ATTEMPTS;

  System.out.println("有錯誤發生,錯誤代碼:"

  + e.getErrorCode() + " SQL狀態:"

  + e.getSQLState() + "其他信息:" + e.getMessage());

  }

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

       以上就是我要為大家介紹的全部內容,這些內容都是很實用的哦,掌握了這些在應對超時和死鎖的問題時,您就能輕松應對啦,還等什么,趕快來學習吧。

【編輯推薦】

  1. java數據庫設計中的14個技巧
  2. Java技巧:Java連接數據庫技巧全攻略
  3. Java訪問ACCESS數據庫的方法
責任編輯:迎迎 來源: 天極網
相關推薦

2011-06-07 11:09:19

JAVA

2009-03-31 09:50:15

死鎖超時Java

2023-09-13 14:52:11

MySQL數據庫

2010-04-26 13:23:49

Oracle數據庫

2011-05-26 13:36:40

Oracle數據庫時間處理

2024-08-19 11:45:18

2023-12-29 22:39:25

Golang應用程序數據庫

2018-01-24 20:42:06

數據庫NoSQL驅動力

2011-06-03 10:50:27

Java

2009-07-06 15:57:56

獲取數據庫連接JSP

2009-03-30 10:56:58

SQL Server數據庫死鎖數據庫

2017-10-25 15:27:52

MySQL數據庫超時設置

2009-05-18 13:18:54

字符Oracle字符串

2011-03-08 09:27:34

SQL Server數死鎖

2019-05-13 08:24:58

數據庫MySQLInnoDB

2010-11-29 10:11:05

Sybase數據庫死鎖

2011-04-14 10:07:32

內存數據庫聯通BSS賬務處理系統

2011-08-10 15:46:29

數據庫

2014-04-08 16:00:17

云計算云數據庫

2009-09-10 09:15:38

監視程序死鎖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片a级 | 亚洲精品无 | 日日夜夜天天 | 亚洲九九色 | 日韩精品专区在线影院重磅 | 拍真实国产伦偷精品 | 一区二区av | 亚洲国产一区视频 | 伊人免费观看视频 | www.国产精品 | 香蕉视频久久久 | 亚洲综合在线一区 | 欧美成人一区二区 | 麻豆av电影网 | 久久久久国产精品 | 国产精品久久久久久久毛片 | 蜜臀久久99精品久久久久野外 | 欧美日韩亚洲国产 | 成人啊啊啊 | 日韩免费福利视频 | 精品日韩在线观看 | 久久久夜色精品亚洲 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 91亚洲免费 | 91久色 | 羞羞视频网站免费观看 | 高清18麻豆 | 91视频进入 | 黄色亚洲 | 性福视频在线观看 | 夜夜爽99久久国产综合精品女不卡 | 日韩在线一区二区 | 美女网站视频免费黄 | 久久精品二区亚洲w码 | 黄色男女网站 | 天天影视网天天综合色在线播放 | 国产精品久久久久久久久久 | 国产999精品久久久影片官网 | 黄色香蕉视频在线观看 | 看片一区 | 黄网站免费在线观看 |