詳解Java數(shù)據(jù)庫連接池
一、什么是數(shù)據(jù)庫連接池
就是一個(gè)容器持有多個(gè)數(shù)據(jù)庫連接
,當(dāng)程序需要操作數(shù)據(jù)庫的時(shí)候直接從池中取出連接,使用完之后再還回去,和線程池一個(gè)道理。
二、為什么需要連接池,好處是什么?
1.節(jié)省資源,如果每次訪問數(shù)據(jù)庫都創(chuàng)建新的連接,創(chuàng)建和銷毀都浪費(fèi)系統(tǒng)資源
2.響應(yīng)性更好,省去了創(chuàng)建的時(shí)間,響應(yīng)性更好。
3.統(tǒng)一管理數(shù)據(jù)庫連接,避免因?yàn)闃I(yè)務(wù)的膨脹導(dǎo)致數(shù)據(jù)庫連接的無限增多。
4.便于監(jiān)控。
三、都有哪些連接池方案
數(shù)據(jù)庫連接池的方案有不少,我接觸過的連接池方案有:
1.C3p0
這個(gè)連接池我很久之前看到過,但是當(dāng)時(shí)自己還很弱小,并沒有很好的理解,現(xiàn)在用的也很少了,爺爺級(jí)的連接池,可以忽略
2.DBCP (Database Connection Pool)
這個(gè)名字很直白,數(shù)據(jù)庫連接池,從Tomcat 5.5開始,Tomcat 內(nèi)置了DBCP的數(shù)據(jù)源實(shí)現(xiàn),所以可以非常方便地配置DBCP數(shù)據(jù)源。
3.Druid
阿里開源的數(shù)據(jù)源,這個(gè)也是前公司使用的數(shù)據(jù)源,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,強(qiáng)項(xiàng)在于監(jiān)控。
4.HiKariCP
號(hào)稱最快的數(shù)據(jù)庫連接池,springboot2.0 也已經(jīng)把默認(rèn)的數(shù)據(jù)源改為了HikariCP,強(qiáng)于性能。
四、連接池需要關(guān)注的參數(shù)
看下Druid 的數(shù)據(jù)庫連接池的配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${db.driverClassName}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> <property name="initialSize" value="5"/> <property name="maxIdle" value="10"/> <property name="minIdle" value="5"/> <property name="maxActive" value="15"/> <property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" value="180"/> <property name="maxWait" value="3000"/> <property name="validationQuery"> <value>SELECT 1</value> </property> <property name="testOnBorrow"> <value>true</value> </property> </bean>
1.driverClassName 使用的JDBC驅(qū)動(dòng)的完整有效的Java類名,如連接 mysql com.mysql.cj.jdbc.Driver
2.jdbcUrl 數(shù)據(jù)庫的連接。如 jdbc:mysql://127.0.0.1:3306/mydatabase
3.username 你懂的,數(shù)據(jù)庫的用戶名,如 root
4.password 太直白了 ,數(shù)據(jù)庫的用戶密碼,如 p123456
5.initialSize 連接池創(chuàng)建的時(shí)候,自動(dòng)創(chuàng)建的數(shù)據(jù)庫連接數(shù)量,建議 10-50足夠
6.maxIdle 最大空閑連接:連接池中允許保持空閑狀態(tài)的最大連接數(shù)量,超過的空閑連接將被釋放,如果設(shè)置為負(fù)數(shù)表示不限制,建議設(shè)置和 與initialSize相同,減少釋放和創(chuàng)建的性能損耗。
7.minIdle 最小空閑連接:連接池中容許保持空閑狀態(tài)的最小連接數(shù)量,低于這個(gè)數(shù)量將創(chuàng)建新的連接,如果設(shè)置為0則不創(chuàng)建
8.maxActive 最大同時(shí)激活的連接數(shù)量。
9.maxWait 如果連接池中沒有可用的連接,最大的等待時(shí)間,超時(shí)則沒有可用連接,單位毫秒,設(shè)置-1時(shí)表示無限等待,建議設(shè)置為100毫秒
10.testxxx 在對(duì)連接進(jìn)行操作時(shí),是否檢測(cè)連接的有效性,如 testOnBorrow 在申請(qǐng)連接的時(shí)候會(huì)先檢測(cè)連接的有效性,執(zhí)行validationQuery ,建議線上的把此配置設(shè)置為false,因?yàn)闀?huì)影響性能。
11.validationQuery 檢查池中的連接是否仍可用的 SQL 語句,drui會(huì)連接到數(shù)據(jù)庫執(zhí)行該SQL, 如果正常返回,則表示連接可用,否則表示連接不可用,建議 select 1 from dual
五、怎么創(chuàng)建連接池,show me the code
5.1 pom.xml 加入依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.6</version> </dependency>
5.2 配置文件
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本屬性 url、user、password --> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc_url}" /> <property name="username" value="${jdbc_user}" /> <property name="password" value="${jdbc_password}" /> <!-- 配置監(jiān)控統(tǒng)計(jì)攔截的filters --> <property name="filters" value="stat" /> <!-- 配置初始化大小、最小、最大 --> <property name="maxActive" value="20" /> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <!-- 配置獲取連接等待超時(shí)的時(shí)間 --> <property name="maxWait" value="60000" /> <!-- 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打開PSCache,并且指定每個(gè)連接上PSCache的大小 --> <property name="poolPreparedStatements" value="true" /> <property name="maxOpenPreparedStatements" value="20" /> </bean> <!--配置jdbcTemplate,如果userDao沒有extends JdbcDaoSupport--> <<bean id="jdbcTemplate" class="com.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="userDao" class="com.caraway.dao.UserDao"> <property name="dataSource" ref="jdbcTemplate"/> </bean>
5.3 調(diào)用
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) context.getBean("userDao"); User user = new User(); user.setUsername("香菜"); user.setPassowrd("root"); userDao.saveUser(user); }
六、總結(jié)
連接池和線程池的道理是一樣的,池化資源,降低生成和銷毀的損耗,提高系統(tǒng)的響應(yīng)。
今天的重點(diǎn)還是要理解線程池的原理,并且記住大部分的配置參數(shù),各個(gè)線程池雖然實(shí)現(xiàn)的細(xì)節(jié)不同,但是道理是相通的,掌握一個(gè)就掌握了所有,舉一反三。
到此這篇關(guān)于詳解Java數(shù)據(jù)庫連接池的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫連接池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用feign服務(wù)調(diào)用添加Header參數(shù)
這篇文章主要介紹了使用feign服務(wù)調(diào)用添加Header參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java concurrency之非公平鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本篇文章主要介紹了Java concurrency之非公平鎖,詳細(xì)的介紹了獲取和釋放非公平鎖,有興趣的同學(xué)可以了解一下2017-06-06Spring Data JPA例子代碼[基于Spring Boot、Mysql]
這篇文章主要介紹了Spring Data JPA例子代碼[基于Spring Boot、Mysql],小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04IDEA2022創(chuàng)建Maven Web項(xiàng)目教程(圖文)
本文主要介紹了IDEA2022創(chuàng)建Maven Web項(xiàng)目教程,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java 獲取當(dāng)前類名和方法名的實(shí)現(xiàn)方法
這篇文章主要介紹了 Java 獲取當(dāng)前類名和方法名的實(shí)現(xiàn)方法的相關(guān)資料,這里不僅提供了實(shí)現(xiàn)方法并比較幾種方法的效率,需要的朋友可以參考下2017-07-07基于Java字符串 "==" 與 "equals" 的深入理解
本篇文章是對(duì)Java中的字符串"=="與"equals"進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06