Java實(shí)現(xiàn)數(shù)據(jù)連接池Druid舉例
開篇
Druid號(hào)稱是Java語言中最好的數(shù)據(jù)庫連接池,并且能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。作為日常使用較多的數(shù)據(jù)庫連接組件,純粹個(gè)人興趣研究下理解下的實(shí)現(xiàn)原理。
理解一個(gè)工具組件最好的方式就是進(jìn)行 debug,這里建議大家下載下參考連接中的 druid demo,修改下具體的數(shù)據(jù)庫連接參數(shù)就可以直接進(jìn)行調(diào)試跟蹤。
之所以強(qiáng)調(diào) Demo 的重要性,在于通過 demo 能夠跟蹤所有的執(zhí)行流程,有了 Demo 剩下的事情只要花時(shí)間都能很好的梳理。
Druid的調(diào)試
url=jdbc:mysql://localhost:3306/github_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=true username=root password=123456 name=zzs001 driverClassName=com.mysql.cj.jdbc.Driver initialSize=4 maxActive=8 minIdle=0 maxWait=-1 poolPreparedStatements=false maxOpenPreparedStatements=10 validationQuery=select 1 from dual validationQueryTimeout=-1 testOnBorrow=false testOnReturn=false testWhileIdle=true timeBetweenEvictionRunsMillis=-1 minEvictableIdleTimeMillis=1800000 defaultAutoCommit=true defaultReadOnly=false defaultTransactionIsolation=REPEATABLE_READ defaultCatalog=github_demo removeAbandoned=false removeAbandonedTimeoutMillis=300*1000 logAbandoned=true filters=log4j,wall,mergeStat connectionProperties=druid.useGlobalDataSourceStat=true;druid.stat.logSlowSql=true;druid.stat.slowSqlMillis=5000 accessToUnderlyingConnectionAllowed=false init=true
基礎(chǔ)的配置信息如上,核心在于 JDBC 的連接地址信息。
public class DruidDataSourceTest { ? ? @Test ? ? public void save() throws SQLException { ? ? ? ? // 創(chuàng)建sql ? ? ? ? String sql = "insert into demo_user values(null,?,?,?,?,?)"; ? ? ? ? Connection connection = null; ? ? ? ? PreparedStatement statement = null; ? ? ? ? try { ? ? ? ? ? ? // 獲得連接 ? ? ? ? ? ? connection = JDBCUtils.getConnection(); ? ? ? ? ? ? // 開啟事務(wù)設(shè)置非自動(dòng)提交 ? ? ? ? ? ? connection.setAutoCommit(false); ? ? ? ? ? ? // 獲得Statement對(duì)象 ? ? ? ? ? ? statement = connection.prepareStatement(sql); ? ? ? ? ? ? // 設(shè)置參數(shù) ? ? ? ? ? ? statement.setString(1, "zzf003"); ? ? ? ? ? ? statement.setInt(2, 18); ? ? ? ? ? ? statement.setDate(3, new Date(System.currentTimeMillis())); ? ? ? ? ? ? statement.setDate(4, new Date(System.currentTimeMillis())); ? ? ? ? ? ? statement.setBoolean(5, false); ? ? ? ? ? ? // 執(zhí)行 ? ? ? ? ? ? statement.executeUpdate(); ? ? ? ? ? ? // 提交事務(wù) ? ? ? ? ? ? connection.commit(); ? ? ? ? } finally { ? ? ? ? ? ? // 釋放資源 ? ? ? ? ? ? JDBCUtils.release(connection, statement, null); ? ? ? ? } ? ? } }
核心步驟獲獲取 Connection 并設(shè)置并通過 Connection 設(shè)置statement,最后通過statement進(jìn)行 SQL 的執(zhí)行。
public class JDBCUtils { ? ? private static DataSource dataSource; ? ? private static ThreadLocal<Connection> tl = new ThreadLocal<>(); ? ? private static final Log log = LogFactory.getLog(JDBCUtils.class); ? ? static { ? ? ? ? init(); ? ? } ? ? private static void init() { ? ? ? ? Properties properties = new Properties(); ? ? ? ? InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); ? ? ? ? try { ? ? ? ? ? ? properties.load(in); ? ? ? ? ? ? dataSource = DruidDataSourceFactory.createDataSource(properties); ? ? ? ? } catch(Exception e) { ? ? ? ? ? ? throw new RuntimeException("創(chuàng)建數(shù)據(jù)源失敗", e); ? ? ? ? } ? ? } ? ? /** ? ? ?* <p>獲取數(shù)據(jù)庫連接對(duì)象的方法,線程安全</p> ? ? ?* @return: Connection ? ? ?*/ ? ? public static Connection getConnection() throws SQLException { ? ? ? ? // 從當(dāng)前線程中獲取連接對(duì)象 ? ? ? ? Connection connection = tl.get(); ? ? ? ? // 判斷為空的話,創(chuàng)建連接并綁定到當(dāng)前線程 ? ? ? ? if(connection == null) { ? ? ? ? ? ? connection = createConnection(); ? ? ? ? ? ? tl.set(connection); ? ? ? ? } ? ? ? ? return connection; ? ? } ? ? /** ? ? ?* <p>創(chuàng)建數(shù)據(jù)庫連接</p> ? ? ?* @return: Connection ? ? ?* @throws SQLException? ? ? ?*/ ? ? private static Connection createConnection() throws SQLException { ? ? ? ? Connection conn = null; ? ? ? ? // 獲得連接 ? ? ? ? conn = dataSource.getConnection(); ? ? ? ? return conn; ? ? } }
- 通過DruidDataSourceFactory創(chuàng)建 DataSource。
- 通過DataSource獲取 Connection。
參考
到此這篇關(guān)于Java實(shí)現(xiàn)數(shù)據(jù)連接池Druid舉例的文章就介紹到這了,更多相關(guān)Java 數(shù)據(jù)連接池Druid內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)短信驗(yàn)證碼的示例代碼
Java是一種流行的編程語言,驗(yàn)證碼是一種常用的網(wǎng)絡(luò)安全技術(shù)。Java發(fā)展至今,網(wǎng)上也出現(xiàn)了各種各樣的驗(yàn)證碼,下面是用Java實(shí)現(xiàn)短信驗(yàn)證碼的總結(jié),感興趣的可以了解一下2023-03-03Java數(shù)據(jù)結(jié)構(gòu)之線段樹詳解
線段樹是一種二叉搜索樹,與區(qū)間樹相似,它將一個(gè)區(qū)間劃分成一些單元區(qū)間,每個(gè)單元區(qū)間對(duì)應(yīng)線段樹中的一個(gè)葉結(jié)點(diǎn)。本文將介紹線段樹的Java實(shí)現(xiàn)代碼,需要的可以參考一下2022-01-01SpringBoot如何優(yōu)雅實(shí)現(xiàn)接口參數(shù)驗(yàn)證
為了保證參數(shù)的正確性,我們需要使用參數(shù)驗(yàn)證機(jī)制,來檢測(cè)并處理傳入的參數(shù)格式是否符合規(guī)范,所以本文就來和大家聊聊如何優(yōu)雅實(shí)現(xiàn)接口參數(shù)驗(yàn)證吧2023-08-08application.yml的格式寫法和pom.xml讀取配置插件方式
這篇文章主要介紹了application.yml的格式寫法和pom.xml讀取配置插件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java 后端開發(fā)中Tomcat服務(wù)器運(yùn)行不了的五種解決方案
tomcat是在使用Java編程語言開發(fā)服務(wù)端技術(shù)使用最廣泛的服務(wù)器之一,但經(jīng)常在開發(fā)項(xiàng)目的時(shí)候會(huì)出現(xiàn)運(yùn)行不了的情況,這里總結(jié)出幾種能解決的辦法2021-10-10使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式
這篇文章主要介紹了使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java利用遞歸算法實(shí)現(xiàn)查詢斐波那契數(shù)
今天小編就為大家分享一篇關(guān)于Java利用遞歸算法實(shí)現(xiàn)查詢斐波那契數(shù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12