簡介:
數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數(shù)量的連接藏雏,當需要建立數(shù)據(jù)庫連接時拷况,只需從“緩沖池”中取出一個,使用完畢之后再放回去掘殴。數(shù)據(jù)庫連接池負責分配赚瘦、管理和釋放數(shù)據(jù)庫連接,它允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接奏寨,而不是重新建立一個起意。它的優(yōu)勢有:
(1)資源重用
(2)更快的系統(tǒng)反應速度
(3)新的資源分配手段對于多應用共享同一數(shù)據(jù)庫的系統(tǒng)而言,可在應用層通過數(shù)據(jù)庫連接池的配置實現(xiàn)某一應用最大可用數(shù)據(jù)庫連接數(shù)的限制避免某一應用獨占所有的數(shù)據(jù)庫資源.
(4)統(tǒng)一的連接管理病瞳,避免數(shù)據(jù)庫連接泄露在較為完善的數(shù)據(jù)庫連接池實現(xiàn)中揽咕,可根據(jù)預先的占用超時設定,強制回收被占用連接仍源,從而避免了常規(guī)數(shù)據(jù)庫連接操作中可能出現(xiàn)的資源泄露
主流的java連接池
C3P0連接池
DBCP
Proxool
...
1.記錄 用C3P0連接池鏈接
下載C3P0連接池jar包 提取碼:【27583EBAA9133A75D489356B99734362】經(jīng)過MD5加密 ( ̄▽ ̄)皮一下 很開心
導入jar包到你需要的項目里面
ps
在src
文件夾粘貼下載下來的c3p0-config.xml
文件(當然也可以自己新建揩抡,但是名字一定一致)
然后配置這個文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="user">root</property>
<property name="password">123456</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/java_web?useSSL=true</property>
<!--以上的user是數(shù)據(jù)庫的用戶蚯撩,password是數(shù)據(jù)庫的密碼,driverClass是mysql的數(shù)據(jù)庫驅(qū)動蛔垢,jdbcUrl是連接數(shù)據(jù)庫的url -->
<!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數(shù) -->
<property name="acquireIncrement">5</property>
<!--初始化時獲取十個連接,取值應在minPoolSize與maxPoolSize之間 -->
<property name="initialPoolSize">10</property>
<!--連接池中保留的最小連接數(shù) -->
<property name="minPoolSize">10</property>
<!--連接池中保留的最大連接數(shù) -->
<property name="maxPoolSize">50</property>
<!--JDBC的標準參數(shù)掘而,用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量挟冠。但由于預緩存的statements屬于單個connection而不是整個連接池。所以設置這個參數(shù)需要考慮到多方面的因素袍睡。如果maxStatements與maxStatementsPerConnection均為0知染,則緩存被關閉。Default: 0-->
<property name="maxStatements">20</property>
<!--maxStatementsPerConnection定義了連接池內(nèi)單個連接所擁有的最大緩存statements數(shù)斑胜。Default: 0 -->
<property name="maxStatementsPerConnection">5</property>
</default-config>
<named-config name="mysql">//這個名字注意了
<property name="user">root</property>//不是用戶名
<property name="password">123456</property>//不是密碼
<property name="driverClass">com.mysql.jdbc.Driver</property>//認不到系列驅(qū)動
<property name="jdbcUrl">jdbc:mysql://localhost:3306/java_web??useUnicode=true&useSSL=false</property>//java_web 請不要替換成你的數(shù)據(jù)庫名字
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">50</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
配置信息主要是填寫數(shù)據(jù)庫驅(qū)動控淡、數(shù)據(jù)庫名稱、數(shù)據(jù)庫用戶名止潘、密碼等等
建立一個TestC3p0測試類
假設我們mysql java_web
數(shù)據(jù)庫有一個表user_table
如下
package demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestC3p0 {
public void testSelect() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//1.創(chuàng)建自定義連接池對象
//此種方法加載的配置文件中默認配置default-config
// ComboPooledDataSource dataSource = new ComboPooledDataSource();
//加載有名稱的配置named-config
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
try {
//2.從池中獲取對象(改造過后)
conn = dataSource.getConnection();
//3.編寫SQL語句
String sql="select username from user_table where password = ?";
//4.獲取執(zhí)行sql語句的對象
pstmt = conn.prepareStatement(sql);
//5.設置參數(shù)
pstmt.setString(1,"123");
//6.執(zhí)行
rs = pstmt.executeQuery();
//7.處理結(jié)果集
while (rs.next()){
System.out.println(rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
TestC3p0 testC3p0 = new TestC3p0();
testC3p0.testSelect();
}
}
運行結(jié)果
然后我們就可以編寫一個工具類掺炭,方便使用
package demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class C3P0Utils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
/**
* 獲取連接池對象
*/
public static DataSource getDataSource(){
return dataSource;
}
/**
* 從池中獲取連接對象
*/
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 釋放資源
*/
public static void releaseConnection(Connection connection,PreparedStatement pstmt,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
測試工具類的使用
package demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class test {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = C3P0Utils.getConnection();
String sql="select username from user_table where password = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"123");
rs = pstmt.executeQuery();
while (rs.next()){
System.out.println(rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
C3P0Utils.releaseConnection(conn,pstmt,rs);
}
}
}
遇到的問題
1.
原因:
不建議在沒有服務器身份驗證的情況下建立SSL連接,根據(jù)MySQL 5.5.45+、5.6.26+和5.7.6+的要求凭戴,如果沒有設置顯式選項涧狮,則必須默認建立SSL連接。為了符合不使用SSL的現(xiàn)有應用程序么夫,verifyServerCertificate屬性被設置為“false”者冤。您需要通過設置useSSL=false顯式禁用SSL,或者設置useSSL=true并為服務器證書驗證提供信任存儲档痪。
解決