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

歡迎訪問 生活随笔!

生活随笔

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

数据库

手写java数据库连接池,自定义实现数据库连接池,兼容springboot

發布時間:2024/10/5 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手写java数据库连接池,自定义实现数据库连接池,兼容springboot 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、目標

? ? ? ? ? 用精簡的代碼實現一個類似于Hikari,Druid一樣的高性能數據庫連接池。

二、實現思路

? ? ? ?1:新建連接池配置類保存連接池配置。

? ? ? ?2:實現DataSource接口。

? ? ? ?3:新增SmpDbPool類,內部維護一個阻塞隊列保存數據庫連接,并提供數據庫連接的獲取回收等方法。

? ? ? ?4:大致類圖:

三、核心代碼

1:數據庫連接代理類SmpConnectionProxy

SmpConnectionProxy實現jdbc的Connection接口

重寫close方法,確保外部調用close的時候將連接歸還到連接池。

public void close() throws SQLException {if (this.closed) return;this.closed = true;//回滾掉未提交的臟statementif (this.isCommitStateDirty && !this.isAutoCommit){this.delegate.rollback();//}this.clearWarnings();this.smpDbPool.releaseConnection(this);}

新增判斷連接是否有效方法供連接池類使用。

public boolean isValid() throws SQLException {if (System.currentTimeMillis() - this.lastActiveTime < this.smpDbPool.getConfig().getKeepaliveTimeInMill()) return true;long validationTimeout = this.smpDbPool.getConfig().getValidationTimeoutInMill();this.delegate.setNetworkTimeout(this.smpDbPool.getNetTimeoutExecutor(), (int) validationTimeout);int validationSeconds = (int) Math.max(1000L, validationTimeout) / 1000;return this.delegate.isValid(validationSeconds);}

2:數據源類SmpDataSource

SmpDataSource實現DataSource接口

實現getConnection方法,以便外界從連接池獲取連接。

@Overridepublic Connection getConnection() throws SQLException {try {return this.dbPool.borrowConnection();} catch (Exception e) {LOG.error("getConnection error", e);throw new SQLException(e);}}

3:連接池類SmpDbPool

獲取數據庫連接方法:

public Connection borrowConnection() throws Exception {boolean isDebugEnable = LOG.isDebugEnabled();long sTime = 0;if (isDebugEnable){//盡量少訪問臨界資源sTime = System.currentTimeMillis();}try {SmpConnectionProxy connection = this.getConnectionFromQueue();if (connection != null) return connection;//未獲取到有效連接,校驗是否創建連接int maxActive = this.smpConfig.getMaxActive(), dbAmount = createdDbConnectionAmount.get();if (dbAmount >= maxActive){//嘗試等待其他線程釋放連接connection = this.dbConnectQueue.poll(this.smpConfig.getMaxWaitInMill(), TimeUnit.MILLISECONDS);if (connection != null) return connection.borrowConnection();LOG.error("get connection error, no connection available,maxActive:{}, activated connection:{}", maxActive, dbAmount);throw new IllegalStateException("database connection pool too busy");}connection = this.createConnectionForPool();if (connection != null) return connection;throw new IllegalStateException("database connection pool too busy");} finally {if (isDebugEnable){LOG.debug("get database connection cost {} ms", System.currentTimeMillis() - sTime);}}}

從阻塞隊列獲取數據庫連接方法:

private SmpConnectionProxy getConnectionFromQueue() throws SQLException {int times = 0;while (times++ < 1000){SmpConnectionProxy connection = this.dbConnectQueue.poll();if (connection == null) return null;if (connection.isValid()) return connection.borrowConnection();//destroy invalid connectionconnection.destroy();createdDbConnectionAmount.decrementAndGet();LOG.info("destroyed invalid jdbc connection");}return null;}

新建數據庫連接:

private SmpConnectionProxy createConnectionForPool() throws Exception{boolean locked = false;try {locked = GET_CONNECTION_LOCK.tryLock(this.smpConfig.getMaxWaitInMill() >> 1, TimeUnit.MILLISECONDS);if (!locked){LOG.error("get lock to create connection error");return null;}SmpConnectionProxy connection = this.getConnectionFromQueue();if (connection != null) return connection;int dbAmount = createdDbConnectionAmount.get(), maxActive = this.smpConfig.getMaxActive();if (dbAmount >= maxActive){LOG.error("get connection error, no connection available,maxActive:{}, activated connection:{}", maxActive, dbAmount);return null;}connection = this.createConnection();createdDbConnectionAmount.addAndGet(1);return connection.borrowConnection();} catch (ClassNotFoundException ex){LOG.error("class {} not found", this.smpConfig.getDriverClassName(), ex);throw new SQLException(ex);}finally {if (locked){GET_CONNECTION_LOCK.unlock();}}}private SmpConnectionProxy createConnection() throws ClassNotFoundException, SQLException {Class.forName( this.smpConfig.getDriverClassName() );Connection connection = DriverManager.getConnection( this.smpConfig.getUrl(), this.smpConfig.getUsername(), this.smpConfig.getPassword());LOG.debug("create new database connection with url:{}", this.smpConfig.getUrl());return new SmpConnectionProxy(connection, this, connection.getAutoCommit());}

4:構建spring-boot-starter

? ? ? ? ?這里需要說明的是springboot默認會嘗試使用com.zaxxer.hikari.HikariDataSource,org.apache.tomcat.jdbc.pool.DataSource,org.apache.commons.dbcp2.BasicDataSource作為連接池,相關代碼邏輯在org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration,因此配置spring-boot-starter的時候先要確保應用沒有配置連接池。

核心代碼:

?5:springboot使用

添加依賴后再添加如下配置:

spring.datasource.type=com.lauor.smpdb.SmpDataSource #最小連接數,默認4 spring.datasource.smpdb.minIdle=4 #最大連接數,默認40 spring.datasource.smpdb.maxActive=20 #數據庫連接有效期檢查間隔時間ms,默認30分鐘,最小1s spring.datasource.smpdb.keepaliveTimeInMill=1800000 #獲取數據庫連接最大等待時間ms,默認30s,最小1s spring.datasource.smpdb.maxWaitInMill=30000 #數據連接合法性校驗超時時間,默認5s,最小1s spring.datasource.smpdb.validationTimeoutInMill=5000

連接池完整代碼:https://gitee.com/tandatda/smpdb

連接池使用完整demo:https://gitee.com/tandatda/demo-edr-smpdb

總結

以上是生活随笔為你收集整理的手写java数据库连接池,自定义实现数据库连接池,兼容springboot的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产伦精品一区二区三区网站 | 久久久精品一区二区三区 | 日韩不卡高清 | 国产又粗又猛又黄又爽 | 日本国产三级xxxxxx | 99插插插| 麻豆免费在线观看视频 | 国产香蕉精品视频 | 久久久综合精品 | 日本少妇毛茸茸高潮 | 三级免费黄 | 99热这里只有精 | 福利二区视频 | 在线免费黄色网址 | 色噜噜影院 | 色操插| 国产乱码一区 | 毛片视频网站 | 成人免费看 | 久久只有这里有精品 | 九九热精品视频 | 欧美在线视频不卡 | 老女人做爰全过程免费的视频 | 疯狂做受xxxx高潮人妖 | 国产精品久久久久久亚洲伦 | 国产精品视频自拍 | 三级免费黄 | 国产激情啪啪 | 国产视频一区二区不卡 | 成人毛片基地 | 午夜久久网 | 久久伊人超碰 | 伊人伊人伊人 | 综合久久久久久 | 朝桐光一区二区 | 国产经典久久久 | 男人的天堂在线观看av | 中国大陆一级毛片 | 欧美色图一区二区三区 | 欧美图片自拍偷拍 | 国产美女在线观看 | 老女人黄色片 | 天天玩天天干 | 亚洲一区二区电影网 | 麻豆久久久午夜一区二区 | 国产午夜精品一区 | 福利视频亚洲 | 亚洲伦理一区二区三区 | 欧美香蕉在线 | 精品在线一区二区三区 | 视色网 | www.av欧美 | 久久久免费精品视频 | 黑人精品欧美一区二区蜜桃 | 男人的天堂黄色 | 国产又粗又黄又爽 | 人妻换人妻仑乱 | 亚洲最大av| 天天视频入口 | 91精品视频一区二区三区 | 成人免费视频网站在线观看 | 潘金莲一级淫片免费放动漫 | 欧美色炮 | www成人网 | 蜜桃臀aⅴ精品一区二区三区 | 国产日产亚洲系列最新 | 久久九精品 | 2019天天干 | 人妻少妇偷人精品久久久任期 | 亚洲美女屁股眼交 | 三级黄色在线 | 四虎免费在线观看 | av中文字幕网站 | 一区三区在线 | 午夜免费福利网站 | 久久久久久久久久久久久久久久久久久 | 久久桃色 | 亚洲国产中文在线 | 五月网站| 日韩av一区二区三区在线观看 | 精品人妻人人做人人爽夜夜爽 | 国产精品国产三级国产aⅴ下载 | 国产精品不卡在线观看 | 999zyz玖玖资源站永久 | 国产又黄又粗又猛又爽 | 波多野结衣99| 欧美激情三级 | 欧美综合在线一区 | 亚洲欧美日韩精品永久在线 | 成人动漫在线播放 | 婷婷综合社区 | 久久成人激情 | 亚洲福利小视频 | 欧美亚洲色综久久精品国产 | 色呦呦视频在线观看 | 中文字幕第18页 | 欧美一级日韩一级 | 日本黄色www | jizz国产|