一、什么是連接池
連接池是應(yīng)用程序與數(shù)據(jù)庫之間的一個緩沖區(qū),它存儲了一定數(shù)量的空閑數(shù)據(jù)庫連接,當應(yīng)用程序需要連接數(shù)據(jù)庫時,可以從連接池中獲取一個可用連接,使用完畢后再將連接歸還給連接池,從而避免了每次連接都需要創(chuàng)建和銷毀連接的開銷,提高了應(yīng)用程序的性能和可伸縮性。連接池也可以控制數(shù)據(jù)庫連接的數(shù)量和復(fù)用,從而減少了數(shù)據(jù)庫的負擔。
簡單理解的話就是將連接多個連接一次性從遠處拿到自己家抽屜里,需要用的時候就去拿,不用了就放回抽屜,減少了連接的時間,不用去遠處去拿。
二、連接池的好處
連接池的好處可以總結(jié)為以下幾點:
1. 提高性能
數(shù)據(jù)庫連接是資源密集型操作,每次建立連接都需要進行TCP握手,驗證用戶身份等操作。連接池緩存了一定數(shù)量的已經(jīng)建立的連接,可以更快速地獲取和釋放連接,減少了連接建立和關(guān)閉的時間,提高了應(yīng)用程序的性能。
2. 穩(wěn)定性
當并發(fā)量較高時,如果每個請求都建立一個新的數(shù)據(jù)庫連接,可能會導(dǎo)致數(shù)據(jù)庫服務(wù)器過載。使用連接池可以控制連接的數(shù)量,避免過多的連接導(dǎo)致數(shù)據(jù)庫服務(wù)器崩潰。
3. 節(jié)省資源
使用連接池可以重復(fù)利用已有的數(shù)據(jù)庫連接,避免了頻繁創(chuàng)建和關(guān)閉連接的開銷,從而節(jié)省了資源。
4. 提高可靠性
連接池可以監(jiān)控數(shù)據(jù)庫連接的狀態(tài),并在連接出現(xiàn)問題時自動重置連接。這對于保持應(yīng)用程序的可靠性和穩(wěn)定性非常重要。
有四種連接池c3p0、driuid、HikariCP、DBCP
三、導(dǎo)入jar包
因為所有導(dǎo)入jar包步驟都是一致的,所以單拎出來寫
因為需要測試連接池連接數(shù)據(jù)庫是否成功,我們這里使用的是MySql
MySql.jar包:https://dev.mysql.com/downloads/connector/j/
下載MySqljar包
導(dǎo)入jar包
將下載好的jar包復(fù)制到項目中,建議大家建一個文件專門用來放置jar包。
復(fù)制進去就是這樣,接下來添加為庫
添加為庫
右擊jar包添加為庫
根據(jù)需求選擇級別之后直接確定
所有jar包都是這樣導(dǎo)入。
四、c3p0連接池
什么是c3p0
c3p0是開源的JDBC連接池,實現(xiàn)了數(shù)據(jù)源和JNDI綁定,支持JDBC3規(guī)范和JDBC2的標準擴展。目前使用它的開源項目有Hibernate、Spring等。單線程,性能較差,適用于小型系統(tǒng),代碼600KB左右。
下載jar包
C3P0jar包:
https://sourceforge.net/projects/c3p0/
創(chuàng)建配置文件
創(chuàng)建c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--默認配置-->
<default-config>
<!--數(shù)據(jù)庫驅(qū)動-->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<!--數(shù)據(jù)庫的url-->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/vehicleUpkeepDB</property>
<!--用戶名寫自己的-->
<property name="user">root</property>
<!--密碼寫自己的-->
<property name="password">sasa</property>
<!--初始連接數(shù)-->
<property name="initialPoolSize">10</property>
<!--最大連接數(shù)-->
<property name="maxPoolSize">100</property>
<!--最小連接數(shù)-->
<property name="minPoolSize">10</property>
</default-config>
</c3p0-config>
測試連接
// 創(chuàng)建 ComboPooledDataSource 對象,該對象間接實現(xiàn)了 java 官方提供的 DataSource 接口
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//獲取連接,這里會有個異常可能連接不成功,你可以拋出或者處理
Connection connection = dataSource.getConnection();
//執(zhí)行sql語句,這里會有個異常sql語句可能出錯,你可以拋出或者處理
ResultSet resultSet = connection.prepareStatement("select count(0) from user ").executeQuery();
//處理結(jié)果
if(resultSet.next()){
System.out.println(resultSet.getInt(1));
}
//釋放資源
resultSet.close();
connection.close();
結(jié)果
會有很多事務(wù)的東西,需要手動去關(guān)閉
這樣就是連接成功了!
五、driuid連接池
什么是driuid
Druid連接池是一個開源的Java數(shù)據(jù)庫連接池,由阿里巴巴公司開發(fā)和維護。它提供了高性能、高可用、可擴展的數(shù)據(jù)庫連接管理功能,適用于各種 Java應(yīng)用程序。
下載jar包
driuid.jar包:https://repo1.maven.org/maven2/com/alibaba/druid/1.2.0/
導(dǎo)入項目,所有步驟都是一樣的,不會就看上面c3p0
創(chuàng)建配置文件
創(chuàng)建driuid.properties
# 驅(qū)動名稱(連接Mysql)
driverClassName = com.mysql.cj.jdbc.Driver
# 參數(shù)?rewriteBatchedStatements=True表示支持批處理機制
url = jdbc:mysql://localhost:3306/cinemaDB?useServerPrepStmts=true
# 用戶名,注意這里是按"userName"來讀取的
userName = root
# 用戶密碼(自己改)
password = sasa
# 初始化連接數(shù)量
initialSize = 10
# 最小連接數(shù)量
minIdle = 10
# 最大連接數(shù)量
maxActive = 50
# 超時時間5000ms (在等待隊列中的最長等待時間,若超時,)
maxWait = 5000
測試連接
//加載配置文件,會報錯,可能找不到文件,可以選擇拋出或者處理
Properties properties = new Properties();
properties.load(Files.newInputStream(Paths.get("src\\driuid.properties")));
//在工廠中創(chuàng)建一個數(shù)據(jù)源,數(shù)據(jù)源的連接信息來源于properties配置文件中
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//從連接池,獲取連接對象
Connection connection = dataSource.getConnection();
//對sql語句進行預(yù)處理
PreparedStatement preparedStatement = connection.prepareStatement("select count(0) from user ");
//執(zhí)行命令
ResultSet resultSet = preparedStatement.executeQuery();
//處理結(jié)果
if(resultSet.next()){
System.out.println(resultSet.getInt(1));
}
//釋放資源
resultSet.close();
connection.close();
結(jié)果
這樣就是連接成功了!
六、HikariCP連接池
什么是HikariCP
HikariCP 是一個高性能的 JDBC 連接池組件,號稱性能最好的后起之秀,是一個基于BoneCP做了不少的改進和優(yōu)化的高性能JDBC連接池。
下載jar包
HikariCP需要下載三個jar包
HiariCP.jar包:https://repo1.maven.org/maven2/com/zaxxer/HikariCP/4.0.3/
slf4j.jar包:https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/
log4j12.jar包:https://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/1.7.25/
三個jar包都是找到**.jar**的后綴
創(chuàng)建配置文件
創(chuàng)建HikariCP.properties
# 驅(qū)動參數(shù)
jdbcUrl=jdbc:mysql://localhost:3306/vehicleUpkeepDB?characterEncoding=utf8&serverTimezone=GMT%2B8
#驅(qū)動名稱(連接MySql)
DriverClassName = com.mysql.cj.jdbc.Driver
#賬號
username=root
#密碼
password=sasa
上面的都是必須要的,下面都有默認參數(shù)一般不用配置
#常用的參數(shù)
# 從池中借出的連接是否默認自動提交事務(wù)
# 默認 true
autoCommit=true
# 當我從池中借出連接時,愿意等待多長時間。如果超時,將拋出 SQLException
# 默認 30000 ms,最小值 250 ms。支持 JMX 動態(tài)修改
connectionTimeout=30000
# 一個連接在池里閑置多久時會被拋棄
# 當 minimumIdle < maximumPoolSize 才生效
# 默認值 600000 ms,最小值為 10000 ms,0表示禁用該功能。支持 JMX 動態(tài)修改
idleTimeout=600000
# 多久檢查一次連接的活性
# 檢查時會先把連接從池中拿出來(空閑的話),然后調(diào)用isValid()或執(zhí)行connectionTestQuery來校驗活性,如果通過校驗,則放回池里。
# 默認 0 (不啟用),最小值為 30000 ms,必須小于 maxLifetime。支持 JMX 動態(tài)修改
keepaliveTime=0
# 當一個連接存活了足夠久,HikariCP 將會在它空閑時把它拋棄
# 默認 1800000 ms,最小值為 30000 ms,0 表示禁用該功能。支持 JMX 動態(tài)修改
maxLifetime=1800000
# 用來檢查連接活性的 sql,要求是一個查詢語句,常用select 'x'
# 如果驅(qū)動支持 JDBC4.0,建議不設(shè)置,這時默認會調(diào)用 Connection.isValid() 來檢查,該方式會更高效一些
# 默認為空
# connectionTestQuery=
# 池中至少要有多少空閑連接。
# 當空閑連接 < minimumIdle,總連接 < maximumPoolSize 時,將新增連接
# 默認等于 maximumPoolSize。支持 JMX 動態(tài)修改
minimumIdle=5
# 池中最多容納多少連接(包括空閑的和在用的)
# 默認為 10。支持 JMX 動態(tài)修改
maximumPoolSize=10
# 用于記錄連接池各項指標的 MetricRegistry 實現(xiàn)類
# 默認為空,只能通過代碼設(shè)置
# metricRegistry=
# 用于報告連接池健康狀態(tài)的 HealthCheckRegistry 實現(xiàn)類
# 默認為空,只能通過代碼設(shè)置
# healthCheckRegistry=
# 連接池名稱。
# 默認自動生成
poolName=zzsCP
#少用的參數(shù)
# 如果啟動連接池時不能成功初始化連接,是否快速失敗 TODO
# >0 時,會嘗試獲取連接。如果獲取時間超過指定時長,不會開啟連接池,并拋出異常
# =0 時,會嘗試獲取并驗證連接。如果獲取成功但驗證失敗則不開啟池,但是如果獲取失敗還是會開啟池
# <0 時,不管是否獲取或校驗成功都會開啟池。
# 默認為 1
initializationFailTimeout=1
# 是否在事務(wù)中隔離 HikariCP 自己的查詢。
# autoCommit 為 false 時才生效
# 默認 false
isolateInternalQueries=false
# 是否允許通過 JMX 掛起和恢復(fù)連接池
# 默認為 false
allowPoolSuspension=false
# 當連接從池中取出時是否設(shè)置為只讀
# 默認值 false
readOnly=false
# 是否開啟 JMX
# 默認 false
registerMbeans=true
# 數(shù)據(jù)庫 catalog
# 默認由驅(qū)動決定
# catalog=
# 在每個連接創(chuàng)建后、放入池前,需要執(zhí)行的初始化語句
# 如果執(zhí)行失敗,該連接會被丟棄
# 默認為空
# connectionInitSql=
# JDBC 驅(qū)動使用的 Driver 實現(xiàn)類
# 一般根據(jù) jdbcUrl 判斷就行,報錯說找不到驅(qū)動時才需要加
# 默認為空
# driverClassName=
# 連接的默認事務(wù)隔離級別
# 默認值為空,由驅(qū)動決定
# transactionIsolation=
# 校驗連接活性允許的超時時間
# 默認 5000 ms,最小值為 250 ms,要求小于 connectionTimeout。支持 JMX 動態(tài)修改
validationTimeout=5000
# 連接對象可以被借出多久
# 默認 0(不開啟),最小允許值為 2000 ms。支持 JMX 動態(tài)修改
leakDetectionThreshold=0
# 直接指定 DataSource 實例,而不是通過 dataSourceClassName 來反射構(gòu)造
# 默認為空,只能通過代碼設(shè)置
# dataSource=
# 數(shù)據(jù)庫 schema
# 默認由驅(qū)動決定
# schema=
# 指定連接池獲取線程的 ThreadFactory 實例
# 默認為空,只能通過代碼設(shè)置
# threadFactory=
# 指定連接池開啟定時任務(wù)的 ScheduledExecutorService 實例(建議設(shè)置setRemoveOnCancelPolicy(true))
# 默認為空,只能通過代碼設(shè)置
# scheduledExecutor=
# JNDI 配置的數(shù)據(jù)源名
# 默認為空
# dataSourceJndiName=null
測試連接
//加載配置文件
HikariConfig hikariConfig = new HikariConfig("src\\HikariCP.properties");
//在工廠中創(chuàng)建一個數(shù)據(jù)源,數(shù)據(jù)源的連接信息來源于hikariConfig配置文件中
HikariDataSource ds = new HikariDataSource(hikariConfig);
//獲取連接
Connection conn = ds.getConnection();
//執(zhí)行sql語句
ResultSet rs = conn.prepareStatement("select count(*) from user").executeQuery();
//處理結(jié)果
while (rs.next()) {
System.out.println(rs.getInt(1));
}
//釋放資源
conn.close();
rs.close();
結(jié)果
這樣就是連接成功了!
七、DBCP連接池
什么是DBCP
DBCP是Apache Commons項目的一部分,它是一個開源的連接池實現(xiàn),用于管理和重用數(shù)據(jù)庫連接。DBCP提供了一組API來從連接池中獲取和釋放連接,以及對連接進行一些基本的操作,如設(shè)置超時時間、最大連接數(shù)、最大空閑連接數(shù)等。使用DBCP可以提高數(shù)據(jù)庫連接的性能和效率,并減少每次操作都需要創(chuàng)建和關(guān)閉連接的開銷。
DBCP需要下載兩個jar包
DBCP.jar包:https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
pool.jar包:https://commons.apache.org/proper/commons-pool/download_pool.cgi
下載jar包
兩個都是這個位置
配置文件
創(chuàng)建DBCP.properties
#數(shù)據(jù)庫連接地址
#url=jdbc:mysql://localhost:3306/數(shù)據(jù)庫名(?配置參數(shù))
url=jdbc:mysql://localhost:3306/vehicleUpkeepDB?useUnicode=true&characterEncoding=utf-8
#數(shù)據(jù)庫驅(qū)動類的全名
#driverClassName=com.mysql.jdbc.Driver
#數(shù)據(jù)庫帳號
username=root
#數(shù)據(jù)庫密碼 等于號后面直接填密碼,不需要引號,密碼為空時可以不填或 ""
password=sasa
#初始化連接池時,創(chuàng)建的連接數(shù)量
initialSize=5
#連接池的最大連接容量,連接使用完后不釋放會很容易達到最大值,導(dǎo)致之后的連接被卡住
maxActive=20
#空閑時允許保留的最大連接數(shù)量
maxIdle=5
#空閑時允許保留的最小連接數(shù)量
minIdle=5
#排隊等候的超時時間(毫秒)
maxWait=3000
測試連接
//文件輸入流
InputStream is = DBCP_Demo.class.getClassLoader().getResourceAsStream("DBCP.properties");
//將配置文件,轉(zhuǎn)換為Properties對象
Properties ppt = new Properties();
ppt.load(is);
//通過連接池的工廠類(DruidDataSourceFactory)的創(chuàng)建連接池的方法(createDataSource())
DataSource ds = BasicDataSourceFactory.createDataSource(ppt);
//從連接池,獲取連接對象
Connection con = ds.getConnection();
//對sql語句進行預(yù)處理
PreparedStatement ps = con.prepareStatement("select count(*) from user");
//執(zhí)行命令
ResultSet re = ps.executeQuery();
//處理結(jié)果
if(re.next()){
int anInt = re.getInt(1);
System.out.println(anInt);
}
//釋放資源
re.close();
ps.close();
con.close();
結(jié)果:
可能遇到的問題
NoClassDefFoundError 錯誤
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class lesson04.utils.JDBCUtils_DBCP
原因:DBCP2之后的版本需要 logging 包
官網(wǎng)下載:https://commons.apache.org/proper/commons-logging/download_logging.cgi
按照上面的步驟導(dǎo)入 IDEA 中即可
總結(jié)
C3P0、Druid、HikariCP和DBCP是四種常見的Java連接池,它們在性能、功能和可配置性方面存在一些區(qū)別,如下所示:文章來源:http://www.zghlxwxcb.cn/news/detail-856162.html
- C3P0(連接池名稱:ComboPooledDataSource):
- 功能豐富:提供了連接池的基本功能以及連接的超時、最小閑置連接數(shù)、最大連接數(shù)等配置選項。
- 可配置性:可以通過配置文件或代碼進行靈活的參數(shù)配置,但配置較為復(fù)雜。
- 成熟穩(wěn)定:C3P0是一個成熟且穩(wěn)定的連接池,被廣泛使用。
- Druid(連接池名稱:DruidDataSource):
- 高性能:Druid以高性能著稱,具備較低的資源消耗和較高的并發(fā)能力。
- 監(jiān)控功能:提供了豐富的監(jiān)控接口和統(tǒng)計功能,可以實時監(jiān)控連接的使用情況、SQL執(zhí)行性能等。
- 安全性:Druid可以對連接進行安全檢查,防止SQL注入等安全問題。
- 可配置性:提供了豐富的配置選項,可以根據(jù)需求進行靈活配置。
- HikariCP(連接池名稱:HikariDataSource):
- 極致性能:HikariCP被認為是目前性能最好的連接池,具有快速啟動、低資源消耗和高并發(fā)能力。
- 簡單易用:配置簡單、代碼精簡,易于集成和使用。
- 自適應(yīng):HikariCP可以根據(jù)應(yīng)用程序的負載自動調(diào)整連接池的大小。
- DBCP(連接池名稱:BasicDataSource):
- 常用連接池:DBCP是Apache開發(fā)的連接池,是較早期的連接池,被廣泛使用。
- 功能簡單:提供了基本的連接池功能,如連接復(fù)用、最大連接數(shù)限制等。
- 可靠穩(wěn)定:DBCP在穩(wěn)定性和可靠性方面表現(xiàn)良好。
綜上所述,這四種連接池在功能、性能和可配置性方面存在一些不同。C3P0和DBCP是較為常用的連接池,Druid和HikariCP則在性能方面有所突出,同時也提供了更多的監(jiān)控和安全功能。選擇合適的連接池應(yīng)該根據(jù)具體需求和場景來決定。文章來源地址http://www.zghlxwxcb.cn/news/detail-856162.html
到了這里,關(guān)于JDBC中C3P0、Druid、HikariCP 、DBCP連接池的jar包下載與IDEA配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!