關於c3p0連接池的配置與使用網上教程很多,但很多朋友在配置的時候出現了不少這樣那樣的問題,這里我就詳細介紹怎么配置以及出現問題的解決方案!
先下載c3p0的依賴包和數據庫的驅動包:
c3p0依賴包官網下載:https://sourceforge.net/projects/c3p0/
數據庫驅動包官網下載:https://dev.mysql.com/downloads/file/?id=479586
1.把下載的c3p0依賴包的那個文件夾里面的src目錄下的兩個*.jar包拷貝到你的項目中,最好在項目中新建一個lib文件夾放在里面,方便管理。
2.把下載的數據庫驅動包文件夾里面的mysql-connector-java-8.0.12.jar也拷貝到你的項目中。
3.注意!!!在官網下的時候最好下載最新的版本,因為一般兼容性比較好,否則在配置連接的時候會出問題。
在項目的src目錄下新建一個c3p0-config.xml文件,文件內容如下(這里以配置mysql為例):
c3p0-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<c3p0-config>
<!--默認配置-->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property> <!--mysql驅動包 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/atm</property> <!--數據庫地址 -->
<property name="user">root</property> <!--用戶名 -->
<property name="password">123456</property> <!--用戶密碼 -->
</default-config>
</c3p0-config>
這里的設置為默認的配置 < default-config >,如果還想配置其他的數據庫連接源的就要指定連接源的名稱,比如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<c3p0-config>
<!--默認配置-->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property> <!--mysql驅動包 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/atm</property> <!--數據庫地址 -->
<property name="user">root</property> <!--用戶名 -->
<property name="password">root</property> <!--用戶密碼 -->
</default-config>
<!--指定連接源的配置-->
<named-config name="mysql_2">
<property name="driverClass">com.mysql.jdbc.Driver</property> <!--mysql驅動包 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/user</property> <!--數據庫地址 -->
<property name="user">root</property> <!--用戶名 -->
<property name="password">root</property> <!--用戶密碼 -->
</named-config>
</c3p0-config>
一般情況下不需要太大用途的話這樣配置就行了,其參數都是默認的,如果有其他的需求,比如設置最大連接數,最長連接時間等,那就還要在配置文件中增加其他的屬性以及設定該屬性的值value,這里不再說明,有需要的自行百度查找就OK了!!!
接下來就是編寫數據庫連接池的使用部分了,在src目錄的某個包中新建一個*.java 文件,文件內容如下:
DBUtils.java:
package cn.com.bfec.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DBUtils {
static ComboPooledDataSource cpds = null;
/*
* 1.選擇配置的連接池
*/
static {
cpds = new ComboPooledDataSource();
}
/*
* 2.獲得與數據庫的連接
*/
public static Connection getConnection() {
try {
return cpds.getConnection();
}catch(SQLException e) {
e.printStackTrace();
return null;
}
}
/*
* 3.關閉與數據庫的連接
* !-->此關閉與數據庫的連接不是真正把連接的數據庫關閉,而是將對象放回數據庫連接池中
*/
public static void close(Connection conn,PreparedStatement pstm,ResultSet rs) {
if(rs!=null) {
try {
rs.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
if(pstm!=null) {
try {
pstm.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
在編寫這個類文件時,特別是用eclipse做Java Project項目開發的,提示ComboPoolDataSource cannot be resolve to a type! 然后那個import的包import com.mchange.v2.c3p0.ComboPooledDataSource;也出錯,這是因為ComboPoolDataSource這個數據類型找不到關聯依賴包的原因。此時只需要:選中ComboPoolDataSource , 按ctrl + 1 ,在彈出來的解決方案中雙擊一個叫建立(修復)關聯的解決方案(一般是最后那個選項),再確認即可解決問題, 這時在項目結構中會多出一個Referenced Libraries文件夾就是用來存放關聯文件的。
4 . 右擊 Referenced Libraries—>Build Path—>Configure Build Path—>Add JARS—>選擇該項目中存放的數據庫驅動包 mysql-connector-java-8.0.12.jar—>OK—>Apply and Close,這樣就將數據庫的驅動也建立了關聯,此步驟很重要,如果沒建立關聯,數據庫是連接不上的!!!
5 . 最后編寫一個測試類測試能否正常使用c3p0數據庫連接池連上數據庫:
DBTest.java
package cn.com.bfec.DB;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.com.bfec.utils.DBUtils;
public class DBTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
conn = DBUtils.getConnection(); //調用工具類的getConnection()方法
String sql = "select * from user"; //SQL語句
if(conn!=null)
System.out.println("哈哈,數據庫連接成功啦");
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
System.out.print(rs.getString("user_name") + " ");
System.out.print(rs.getString("password_login") + " ");
System.out.println();
}
conn.close();//並不是真的關閉,只是將連接放回連接池
} catch (SQLException e) {
e.printStackTrace();
}
}
1
至此,數據庫連接池的配置與使用成功!
常見問題及解決方案:
如果配置什么的都沒問題的情況下出現等待連接,連接超時的情況,那就要檢查一下數據庫服務是否啟動
如果出現:Unknown system variable ‘query_cache_size’,那就是數據庫驅動包的問題,這時就需要下載更高版本的數據庫驅動包。
如果出現:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized... 的ERROR,那么就要在c3p0-config.xml修改連接的URL為:
<property name="jdbcUrl">jdbc:mysql://localhost:3306/atm?serverTimezone=GMT%2b8</property>
如果出現會話失敗: Communication Failure!,首先檢查你的數據庫服務是否啟動,配置的username,password,url是否出錯,特別注意數據庫名寫錯的問題,如果還是不行的話,那么很大的問題就是上面說的數據庫驅動包的問題了。
如果出現了線程死鎖的問題:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@513098 -- APPARENT DEADLOCK!! ,要么就是你在配置c3p0-config.xml時,配置的參數值,比如連接池的最大連接數太大(默認是100)等,這時你就要修改相應的參數值了。另一個原因就是上面所說的數據庫驅動包有問題,導致連接不上,出現線程死鎖。
好了,大致常見的問題就這些。記住,很多問題都是數據庫驅動包、c3p0依賴包、數據庫服務沒啟動,配置的數據庫連接路徑出錯的問題,沿着這幾個思路去解決問題就行了。如果有其他問題,歡迎下方給我留言!
————————————————
版權聲明:本文為CSDN博主「AwayFuture」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/AwayFuture/article/details/82840406
