資料庫連線池之c3p0的配置 + 問題解決方案
阿新 • • 發佈:2018-12-11
關於c3p0連線池的配置與使用網上教程很多,但很多朋友在配置的時候出現了不少這樣那樣的問題,這裡我就詳細介紹怎麼配置以及出現問題的解決方案!
- 先下載c3p0的依賴包和資料庫的驅動包:
1.把下載的c3p0依賴包的那個資料夾裡面的src目錄下的兩個*.jar包拷貝到你的專案中,最好在專案中新建一個lib資料夾放在裡面,方便管理。 2.把下載的資料庫驅動包資料夾裡面的mysql-connector-java-8.0.12.jar也拷貝到你的專案中。 3.注意!!!在官網下的時候最好下載最新的版本,因為一般相容性比較好,否則在配置連線的時候會出問題。
- 在專案的src目錄下新建一個c3p0-config.xml
- 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();
}
}
-
至此,資料庫連線池的配置與使用成功!
-
常見問題及解決方案:
- 如果配置什麼的都沒問題的情況下出現等待連線,連線超時的情況,那就要檢查一下資料庫服務是否啟動
- 如果出現: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[email protected]513098 -- APPARENT DEADLOCK!!
,要麼就是你在配置c3p0-config.xml時,配置的引數值,比如連線池的最大連線數太大(預設是100)等,這時你就要修改相應的引數值了。另一個原因就是上面所說的資料庫驅動包有問題,導致連線不上,出現執行緒死鎖。 - 好了,大致常見的問題就這些。記住,很多問題都是資料庫驅動包、c3p0依賴包、資料庫服務沒啟動,配置的資料庫連線路徑出錯的問題,沿著這幾個思路去解決問題就行了。如果有其他問題,歡迎下方給我留言!