日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

JdbcTemplate数据库连接耗尽问题排查

發布時間:2024/3/13 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JdbcTemplate数据库连接耗尽问题排查 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

問題起因

排查思路

步驟一:通過jvisualvm查看線程情況

步驟二:在代碼中通過打印dbcp可用連接數

步驟三:順著源代碼看 jdbcTemplate.queryForStream

解決方案

思考


問題起因

使用 JdbcTemplate+dbcp連接池進行數據庫訪問

dbcp配置最大連接為10

@Bean public BasicDataSource dataSource() { BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); ds.setUrl("jdbc:mysql://localhost:3306/xxx"); ds.setUsername("root"); ds.setPassword("xxxx"); ds.setInitialSize(5); ds.setMaxTotal(10); return ds; }

JdbcTemplate配置為

@Bean public JdbcTemplate jdbcTemplate(javax.sql.DataSource dataSource) { return new JdbcTemplate(dataSource); }

使用的代碼為

public List<BaseSkuDO> selectByName() { String sql = "select * from base_sku where sku_name like '%瓜';"; Stream<BaseSkuDO> baseSkuDOStream = jdbcTemplate.queryForStream(sql, new BaseSkuDoRowMapper()); List<BaseSkuDO> baseSkuDOs = baseSkuDOStream.collect(Collectors.toList()); return baseSkuDOs; }

代碼運行10次后,代碼夯住,不能繼續運行

排查思路

步驟一:通過jvisualvm查看線程情況

發現一直卡在獲取數據庫連接處,表明獲取不到數據庫連接,懷疑連接耗盡了

步驟二:在代碼中通過打印dbcp可用連接數

System.out.println("dbcp連接池可用連接:"+basicDataSource.getNumIdle()

打印結果:

dbcp連接池可用連接:0

的確被耗盡,所以推斷是連接沒有釋放

在網上查詢JdbcTemplate使用連接是自動釋放的,無需手動釋放

但這里的確沒有歸還

步驟三:順著源代碼看 jdbcTemplate.queryForStream

發現調用execute時,stream方法中傳的關閉資源是false

也就是說 jdbcTemplate.queryForStream 這個方法不會自動關閉連接

所以應該需要手動close 資源

解決方案

在代碼中加入stream的close,運行果然能釋放連接了

public List<BaseSkuDO> selectByName() { String sql = "select * from base_sku where sku_name like '%瓜';"; Stream<BaseSkuDO> baseSkuDOStream = jdbcTemplate.queryForStream(sql, new BaseSkuDoRowMapper()); List<BaseSkuDO> baseSkuDOs = baseSkuDOStream.collect(Collectors.toList()); //加入stream關閉 baseSkuDOStream.close();return baseSkuDOs; }

思考

所以猜這里的stream這種模式,是不會自動關閉的,看一下其他調用jdbcTemplate.execute的地方,果然,除了queryForStream方法

其他的都是可以自動關閉的,看來是遇到坑了,下次一定切記,jdbcTemplate 使用queryForStream方法一定要手動關閉連接。

遇到數據庫連接相關問題以后可以按照此思路排查。

總結

以上是生活随笔為你收集整理的JdbcTemplate数据库连接耗尽问题排查的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。