一篇文章搞定數據庫連接池
1、什麼是數據庫連接池
就是一個容器持有多個數據庫連接,當程序需要操作數據庫的時候直接從池中取出連接,使用完之後再還回去,和線程池一個道理。
2、為什麼需要連接池,好處是什麼?
1、節省資源,如果每次訪問數據庫都創建新的連接,創建和銷毀都浪費系統資源
2、響應性更好,省去瞭創建的時間,響應性更好。
3、統一管理數據庫連接,避免因為業務的膨脹導致數據庫連接的無限增多。
4、便於監控。
3、都有哪些連接池方案
數據庫連接池的方案有不少,我接觸過的連接池方案有:
1、C3p0
這個連接池我很久之前看到過,但是當時自己還很弱小,並沒有很好的理解,現在用的也很少瞭,爺爺級的連接池,可以忽略
2、DBCP (Database Connection Pool)
這個名字很直白,數據庫連接池,從Tomcat 5.5開始,Tomcat 內置瞭DBCP的數據源實現,所以可以非常方便地配置DBCP數據源。
3、Druid
阿裡開源的數據源,這個也是前公司使用的數據源,Druid能夠提供強大的監控和擴展功能,強項在於監控。
4、HiKariCP
號稱最快的數據庫連接池,springboot2.0 也已經把默認的數據源改為瞭HikariCP,強於性能。
4、連接池需要關註的參數
看下Druid 的數據庫連接池的配置:
<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>
1、driverClassName 使用的JDBC驅動的完整有效的Java類名,如連接 mysql com.mysql.cj.jdbc.Driver
2、jdbcUrl 數據庫的連接。如 jdbc:mysql://127.0.0.1:3306/mydatabase
3、username 你懂的,數據庫的用戶名,如 root
4、password 太直白瞭 ,數據庫的用戶密碼,如 p123456
5、initialSize 連接池創建的時候,自動創建的數據庫連接數量,建議 10-50足夠
6、maxIdle 最大空閑連接:連接池中允許保持空閑狀態的最大連接數量,超過的空閑連接將被釋放,如果設置為負數表示不限制,建議設置和 與initialSize相同,減少釋放和創建的性能損耗。
7、minIdle 最小空閑連接:連接池中容許保持空閑狀態的最小連接數量,低於這個數量將創建新的連接,如果設置為0則不創建
8、maxActive 最大同時激活的連接數量。
9、maxWait 如果連接池中沒有可用的連接,最大的等待時間,超時則沒有可用連接,單位毫秒,設置-1時表示無限等待,建議設置為100毫秒
10、testxxx 在對連接進行操作時,是否檢測連接的有效性,如 testOnBorrow 在申請連接的時候會先檢測連接的有效性,執行validationQuery ,建議線上的把此配置設置為false,因為會影響性能。
11、validationQuery 檢查池中的連接是否仍可用的 SQL 語句,drui會連接到數據庫執行該SQL, 如果正常返回,則表示連接可用,否則表示連接不可用,建議 select 1 from dual
5、怎麼創建連接池,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}" /> <!-- 配置監控統計攔截的filters --> <property name="filters" value="stat" /> <!-- 配置初始化大小、最小、最大 --> <property name="maxActive" value="20" /> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <!-- 配置獲取連接等待超時的時間 --> <property name="maxWait" value="60000" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打開PSCache,並且指定每個連接上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 調用
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); }
6、總結
連接池和線程池的道理是一樣的,池化資源,降低生成和銷毀的損耗,提高系統的響應。
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- 如何在SpringBoot 中使用 Druid 數據庫連接池
- druid升級後sql監控頁面為空白的解決
- 使用springboot不自動初始化數據庫連接池
- Java開發druid數據連接池maven方式簡易配置流程示例
- Java 數據庫連接池Druid 的介紹