Java個人總結——JDBC資料庫連線池(二)
三種常見的資料庫連線池
一、DBCP連線池
DBCP(DataBase connection pool),[資料庫連線池]。是 apache 上的一個 java 連線池專案,也是 tomcat 使用的連線池元件。單獨使用dbcp需要2個包:commons-dbcp.jar 和 commons-pool.jar由於建立資料庫連線是一個非常耗時的行為,所以通過連線池預先同資料庫建立一些連線,放在記憶體中,應用程式需要建立資料庫連線時直接到連線池中申請一個就行,用完後再放回去。
1 、DBCP連線池的使用
1.1 建立專案
建立JavaWeb專案1.2 匯入相應jar包
mysql驅動包
commons-dbcp.jar
commons-pool.jar
commons-logging.jar 日誌支援1.3 硬編碼使用DBCP
所謂的硬編碼方式就是在程式碼中新增配置
public class DbcpTest2 {
@Test
public void test() {
//建立DBCP物件
BasicDataSource bds = new BasicDataSource() ;
//1.四個基本引數
bds.setDriverClassName("com.mysql.jdbc.Driver" );
bds.setUrl("jdbc:mysql://localhost:3306/emp");
bds.setUsername("root");
bds.setPassword("root");
//2.其他引數
//初始大小
bds.setInitialSize(10);
//最大空間
bds.setMaxTotal(50);
//最大空閒
bds.setMaxIdle(15);
//最小空閒
bds.setMinIdle(5);
//最大等待時間
bds.setMaxWaitMillis(5000);
try {
for (int i = 0; i < 100; i++) {
Connection conn = bds.getConnection();
System.out.println(conn + ".........." + i);
conn.close();//沒有真的關閉,只是歸還給連線池
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- 1.4 軟編碼使用DBCP
所謂的軟編碼,就是在專案中新增配置檔案,這樣就不需要每次程式碼中新增配合!
專案中新增配置
檔名稱: dbcp.properties
檔案位置: src下
#連線設定
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
#<!-- 初始化連線 -->
initialSize=10
#最大連線數量
maxTotal=50
#<!-- 最大空閒連線 -->
maxIdle=20
#<!-- 最小空閒連線 -->
minIdle=5
#<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等於60秒 -->
maxWaitMillis=5000
程式碼實現
public class DbcpTest {
@Test
public void test() {
//載入屬性檔案
InputStream is = DbcpTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
Properties pro = new Properties();
BasicDataSource bds = null ;
try {
pro.load(is);
//使用工廠獲取資料庫連線池物件
bds = BasicDataSourceFactory.createDataSource(pro) ;
for (int i = 0; i < 100; i++) {
Connection conn = bds.getConnection();
System.out.println(conn + ".........." + i);
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二、 C3P0連線池
C3P0是一個開源的JDBC連線池,它實現了資料來源和JNDI繫結,支援JDBC3規範和JDBC2的標準擴充套件。目前使用它的開源專案有Hibernate,Spring等。
c3p0與dbcp區別
1.
dbcp沒有自動回收空閒連線的功能
c3p0有自動回收空閒連線功能
2.
dbcp需要手動載入配置檔案
c3p0自動載入
1、 使用步驟
1.1 建立專案
1.2 匯入jar包
c3p0-0.9.1.2.jar
mchange-commons-java-0.2.11.jar
mysql驅動包1.3.新增配置檔案
c3p0是在外部新增配置檔案,工具直接進行應用,因為直接引用,所以要求固定的命名和檔案位置
檔案位置: src
檔案命名:c3p0-config.xml 和 c3p0.properties
使用配置檔案:c3p0-config.xml
<!-- 該配置檔案為固定格式,需要時直接複製使用即可,無需記憶 -->
<c3p0-config>
<!-- 預設配置,如果沒有指定則使用這個配置 -->
<default-config>
<!-- 基本配置 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/school</property>
<property name="user">root</property>
<property name="password">root</property>
<!--擴充套件配置-->
<!-- 連線超過10秒報錯-->
<property name="checkoutTimeout">10000</property>
<!--30秒檢查空閒連線 -->
<property name="idleConnectionTestPeriod">30</property>
<!-- 初始大小 -->
<property name="initialPoolSize">10</property>
<!-- 每次增長的個數 -->
<property name="acquireIncrement">5</property>
<!-- 30秒不適用丟棄-->
<property name="maxIdleTime">20</property>
<property name="maxPoolSize">50</property>
<property name="minPoolSize">5</property>
</default-config>
<!-- 自己的配置,named-config name="自定義名稱" -->
<!-- 程式呼叫時可以指定該自定義名稱,若不指定,系統自動呼叫上面的預設配置 -->
<named-config name="my">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day2</property>
<property name="user">root</property>
<property name="password">111</property>
<!-- 如果池中資料連線不夠時一次增長多少個 -->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">40</property>
</named-config>
</c3p0-config>
使用屬性檔案:c3p0.properties
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/school
c3p0.user=root
c3p0.password=root
c3p0.acquireIncrement=5
c3p0.initialPoolSize=20
c3p0.minPoolSize=10
c3p0.maxPoolSize=40
注意:
c3p0的配置檔案內部可以包含命名配置檔案和預設配置檔案!預設是選擇預設配置!如果需要切換命名配置可以在建立c3p0連線池的時候填入命名即可!
如果xml配置檔案和屬性檔案都存在時,xml優先順序高於屬性檔案
程式碼實現:
使用配置檔案配置資料庫連線池
public class C3p0Test2 {
@Test
public void test() {
//使用配置檔案中的自定義配置,不寫引數自動呼叫預設配置
ComboPooledDataSource cpds = new ComboPooledDataSource("my");
try {
//迴圈驗證是否成功
for(int i=0; i<100; i++) {
//從連線池中獲取連線
Connection conn = cpds.getConnection() ;
System.out.println(conn + "......" + i);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
同樣,我們還可以使用硬編碼的形式來配置C3P0
public class C3p0Test {
@Test
public void test() {
ComboPooledDataSource cpds = new ComboPooledDataSource() ;
try {
//1.四個基本引數
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/emp");
cpds.setUser("root");
cpds.setPassword("lvyifan");
//2.其他引數
//2.1設定初始池大小
cpds.setInitialPoolSize(10);
//2.2設定最大池大小
cpds.setMaxPoolSize(50);
//2.3設定最小池大小
cpds.setMinPoolSize(5);
//2.4設定等待時間
cpds.setCheckoutTimeout(5000);
//2.5連線池一次擴充套件的大小
cpds.setAcquireIncrement(5);
for(int i=0; i<100; i++) {
Connection conn = cpds.getConnection() ;
System.out.println(conn + "....." + i);
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
由於此方法是程式碼顯得臃腫,且不易維護,所以我們一般使用配置檔案或屬性檔案的方式進行配置。
三、Druid連線池
Druid 是目前比較流行的高效能的,分散式列儲存的OLAP框架(具體來說是MOLAP)。它有如下幾個特點:
一、亞秒級查詢
druid提供了快速的聚合能力以及亞秒級的OLAP查詢能力,多租戶的設計,是面向使用者分析應用的理想方式。
二、實時資料注入
druid支援流資料的注入,並提供了資料的事件驅動,保證在實時和離線環境下事件的實效性和統一性
三、可擴充套件的PB級儲存
druid叢集可以很方便的擴容到PB的資料量,每秒百萬級別的資料注入。即便在加大資料規模的情況下,也能保證時其效性
四、多環境部署
druid既可以執行在商業的硬體上,也可以執行在雲上。它可以從多種資料系統中注入資料,包括hadoop,spark,kafka,storm和samza等
五、豐富的社群
druid擁有豐富的社群,供大家學習
使用步驟:
1、匯入jar包
druid-1.1.5.jar2、配置檔案 database.properties:
//連線設定
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
<!-- 初始化連線 -->
initialSize=10
//最大連線數量
maxActive=50
<!-- 最小空閒連線 -->
minIdle=5
<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等於60秒 -->
maxWait=5000
實現程式碼:
public class DruitTest2 {
@Test
public void test() {
// 使用類載入器載入屬性檔案
InputStream is = DruitTest2.class.getClassLoader().getResourceAsStream("druid.properties") ;
Properties pro = new Properties() ;
try {
pro.load(is);
// 使用Druid連線池工廠例項化DruidDataSource介面
DruidDataSource dds = (DruidDataSource) DruidDataSourceFactory.createDataSource(pro) ;
for (int i = 0; i < 100; i++) {
Connection conn = dds.getConnection() ;
System.out.println(conn.getClass().getName() + "..." + i);
conn.close() ;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}