最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis update數(shù)據(jù)庫死鎖之獲取數(shù)據(jù)庫連接池等待

 更新時間:2016年07月22日 10:11:56   作者:Ryan.Miao  
這篇文章主要介紹了Mybatis update數(shù)據(jù)庫死鎖之獲取數(shù)據(jù)庫連接池等待的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

 最近學習測試mybatis,單個增刪改查都沒問題,最后使用mvn test的時候發(fā)現(xiàn)了幾個問題:

1.update失敗,原因是數(shù)據(jù)庫死鎖

2.select等待,原因是connection連接池被用光了,需要等待

get:

1.要勇于探索,堅持就是勝利。剛看到錯誤的時候直接懵逼,因為錯誤完全看不出來,屬于框架內部報錯,在猶豫是不是直接睡

覺得了,畢竟也快12點了。最后還是給我一點點找到問題所在了。

2.同上,要敢于去深入你不了解的代碼,敢于研究不懂的代碼。

3.距離一個合格的碼農越來越遠了,因為越學越覺得漏洞百出,自己的代碼到處都是坑。所以,一定要記錄下來。

下面記錄這兩個問題。

1.mysql數(shù)據(jù)庫死鎖

這里,感謝http://www.cnblogs.com/lin-xuan/p/5280614.html,我找到了答案。在這里,我還是重現(xiàn)一下:

數(shù)據(jù)庫死鎖是事務性數(shù)據(jù)庫 (如SQL Server, MySql等)經(jīng)常遇到的問題。除非數(shù)據(jù)庫死鎖問題頻繁出現(xiàn)導致用戶無法操作,一般情況下數(shù)據(jù)庫死鎖問題不嚴重。在應用程序中進行try-catch就可以。那么數(shù)據(jù)死鎖是如何產(chǎn)生的呢?

InnoDB實現(xiàn)的是行鎖 (row level lock),分為共享鎖 (S) 和 互斥鎖 (X)。

•共享鎖用于事務read一行。
•互斥鎖用于事務update或delete一行。

當客戶A持有共享鎖S,并請求互斥鎖X;同時客戶B持有互斥鎖X,并請求共享鎖S。以上情況,會發(fā)生數(shù)據(jù)庫死鎖。如果還不夠清楚,請看下面的例子。

雙開兩個mysql客戶端

客戶端A:

開啟事務,并鎖定共享鎖S 在id=12的時候:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM blog WHERE id = 12 LOCK IN SHARE MODE;
+----+-------+-----------+
| id | name | author_id |
+----+-------+-----------+
| 12 | testA | 50 |
+----+-------+-----------+
1 row in set (0.00 sec)

客戶端B:

開啟事務,嘗試刪除id=12:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> DELETE FROM blog WHERE id = 12;

刪除操作需要互斥鎖 (X),但是互斥鎖X和共享鎖S是不能相容的。所以刪除事務被放到鎖請求隊列中,客戶B阻塞。

這時候客戶端A也想要刪除12:

mysql> DELETE FROM blog WHERE id = 12;
Query OK, 1 row affected (0.00 sec)

和參考文章不同的是,居然刪除成功了,但客戶端B出錯了:

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

于是,我嘗試刪除13,這下都阻塞了:

我的mybatis測試代碼中,因為上一個測試沒有commit導致死鎖,commit后就ok了。在這里,我想說,數(shù)據(jù)庫的東西全還給老師了,關于鎖以及事務需要重新溫習一下了。

2.Mybatis中datasource的數(shù)據(jù)庫連接數(shù)

當我mvn test的時候,我發(fā)現(xiàn)有個查詢的test打印日志:

2016-07-21 23:43:53,356 DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Opening JDBC Connection
2016-07-21 23:43:53,356 DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - Waiting as long as 20000 milliseconds for connection.

于是,果然等了一段時間后才執(zhí)行成功。跟蹤源碼,找到這處日志就明白了。首先,我這里使用的數(shù)據(jù)庫連接配置是mybatis默認的:

<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment> 
當數(shù)據(jù)庫連接池的連接數(shù)用光了之后就要等2s再去獲取:
while (conn == null) {
synchronized (state) {
if (!state.idleConnections.isEmpty()) {
// Pool has available connection
conn = state.idleConnections.remove(0);
if (log.isDebugEnabled()) {
log.debug("Checked out connection " + conn.getRealHashCode() + " from pool.");
}
} else {
// Pool does not have available connection
if (state.activeConnections.size() < poolMaximumActiveConnections) {
// Can create new connection
conn = new PooledConnection(dataSource.getConnection(), this);
if (log.isDebugEnabled()) {
log.debug("Created connection " + conn.getRealHashCode() + ".");
}
} else {
// Cannot create new connection
PooledConnection oldestActiveConnection = state.activeConnections.get(0);
long longestCheckoutTime = oldestActiveConnection.getCheckoutTime();
if (longestCheckoutTime > poolMaximumCheckoutTime) {
// Can claim overdue connection
state.claimedOverdueConnectionCount++;
state.accumulatedCheckoutTimeOfOverdueConnections += longestCheckoutTime;
state.accumulatedCheckoutTime += longestCheckoutTime;
state.activeConnections.remove(oldestActiveConnection);
if (!oldestActiveConnection.getRealConnection().getAutoCommit()) {
try {
oldestActiveConnection.getRealConnection().rollback();
} catch (SQLException e) {
log.debug("Bad connection. Could not roll back");
} 
}
conn = new PooledConnection(oldestActiveConnection.getRealConnection(), this);
oldestActiveConnection.invalidate();
if (log.isDebugEnabled()) {
log.debug("Claimed overdue connection " + conn.getRealHashCode() + ".");
}
} else {
// Must wait
try {
if (!countedWait) {
state.hadToWaitCount++;
countedWait = true;
}
if (log.isDebugEnabled()) {
log.debug("Waiting as long as " + poolTimeToWait + " milliseconds for connection.");
}
long wt = System.currentTimeMillis();
state.wait(poolTimeToWait);
state.accumulatedWaitTime += System.currentTimeMillis() - wt;
} catch (InterruptedException e) {
break;
}
}
}
}
if (conn != null) {
if (conn.isValid()) {
if (!conn.getRealConnection().getAutoCommit()) {
conn.getRealConnection().rollback();
}
conn.setConnectionTypeCode(assembleConnectionTypeCode(dataSource.getUrl(), username, password));
conn.setCheckoutTimestamp(System.currentTimeMillis());
conn.setLastUsedTimestamp(System.currentTimeMillis());
state.activeConnections.add(conn);
state.requestCount++;
state.accumulatedRequestTime += System.currentTimeMillis() - t;
} else {
if (log.isDebugEnabled()) {
log.debug("A bad connection (" + conn.getRealHashCode() + ") was returned from the pool, getting another connection.");
}
state.badConnectionCount++;
localBadConnectionCount++;
conn = null;
if (localBadConnectionCount > (poolMaximumIdleConnections + 3)) {
if (log.isDebugEnabled()) {
log.debug("PooledDataSource: Could not get a good connection to the database.");
}
throw new SQLException("PooledDataSource: Could not get a good connection to the database.");
}
}
}
}
}

當連接數(shù)少于10個的時候回創(chuàng)建,超過10個就會等待,不然就報錯。

以上所述是小編給大家介紹的Mybatis update數(shù)據(jù)庫死鎖之獲取數(shù)據(jù)庫連接池等待,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • Java工程使用ffmpeg進行音視頻格式轉換的實現(xiàn)

    Java工程使用ffmpeg進行音視頻格式轉換的實現(xiàn)

    FFmpeg是一套可以用來記錄、轉換數(shù)字音頻、視頻,并能將其轉化為流的開源計算機程序,本文主要介紹了Java工程使用ffmpeg進行音視頻格式轉換的實現(xiàn)
    2024-02-02
  • 用Java實現(xiàn)OCR功能揭秘

    用Java實現(xiàn)OCR功能揭秘

    想知道如何用Java實現(xiàn)OCR功能嗎?本指南將揭秘這一神秘技術,讓你輕松掌握OCR的實現(xiàn)方法,無論是想提升技能還是解決問題,這篇指南都能幫助你一臂之力,需要的朋友可以參考下
    2023-12-12
  • 在Spring Boot中使用Spark Streaming進行實時數(shù)據(jù)處理和流式計算的步驟

    在Spring Boot中使用Spark Streaming進行實時數(shù)據(jù)處理和流式計算的步驟

    這篇文章主要介紹了在Spring Boot中使用Spark Streaming進行實時數(shù)據(jù)處理和流式計算,通過本文的介紹,我們了解了在Spring Boot中使用Spark Streaming進行實時數(shù)據(jù)處理和流式計算的詳細步驟,需要的朋友可以參考下
    2024-03-03
  • 常見JavaWeb安全問題和解決方案

    常見JavaWeb安全問題和解決方案

    這篇文章主要介紹了常見JavaWeb安全問題和解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • java設計模式--橋接模式詳解

    java設計模式--橋接模式詳解

    這篇文章主要為大家詳細介紹了java設計模式之橋接模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-07-07
  • 解決BeanUtils.copyProperties不支持復制集合的問題

    解決BeanUtils.copyProperties不支持復制集合的問題

    這篇文章主要介紹了解決BeanUtils.copyProperties不支持復制集合的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 在Java中編輯PowerPoint?PPTX文檔的操作過程

    在Java中編輯PowerPoint?PPTX文檔的操作過程

    構建用于程序化編輯?Open?Office?XML文檔(如?PowerPoint、Excel?和?Word)的應用程序從未如此簡單,在本文中,我們將專門討論?PowerPoint?演示文稿?XML(PPTX)文件的結構,并學習如何操作?PPTX?內容的基本過程,需要的朋友可以參考下
    2025-04-04
  • 為何Java8需要引入新的日期與時間庫

    為何Java8需要引入新的日期與時間庫

    這篇文章主要給大家介紹了關于Java8為什么需要引入新的日期與時間庫的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • java并發(fā)編程StampedLock高性能讀寫鎖詳解

    java并發(fā)編程StampedLock高性能讀寫鎖詳解

    這篇文章主要為大家介紹了java并發(fā)編程StampedLock高性能讀寫鎖的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java?Kryo,Protostuff,Hessian序列化方式對比

    Java?Kryo,Protostuff,Hessian序列化方式對比

    這篇文章主要介紹了Java?Kryo,Protostuff,Hessian序列化方式對比,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07

最新評論

全南县| 金昌市| 榕江县| 牡丹江市| 曲水县| 历史| 泰安市| 通江县| 微山县| 玉环县| 宁陵县| 巨野县| 黄冈市| 滨海县| 交城县| 新龙县| 沙洋县| 鹿泉市| 宜君县| 崇明县| 肃南| 平武县| 桐柏县| 广昌县| 苗栗县| 临湘市| 沽源县| 浠水县| 酒泉市| 新泰市| 华亭县| 三门县| 巴南区| 邮箱| 柳河县| 都兰县| 哈尔滨市| 札达县| 五河县| 津市市| 尼木县|