1. 程式人生 > >資料庫連線池之c3p0的配置 + 問題解決方案

資料庫連線池之c3p0的配置 + 問題解決方案

關於c3p0連線池的配置與使用網上教程很多,但很多朋友在配置的時候出現了不少這樣那樣的問題,這裡我就詳細介紹怎麼配置以及出現問題的解決方案!
  1. 先下載c3p0的依賴包和資料庫的驅動包:

1.把下載的c3p0依賴包的那個資料夾裡面的src目錄下的兩個*.jar包拷貝到你的專案中,最好在專案中新建一個lib資料夾放在裡面,方便管理。 2.把下載的資料庫驅動包資料夾裡面的mysql-connector-java-8.0.12.jar也拷貝到你的專案中。 3.注意!!!在官網下的時候最好下載最新的版本,因為一般相容性比較好,否則在配置連線的時候會出問題。

  1. 在專案的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了!!!

  1. 接下來就是編寫資料庫連線池的使用部分了,在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. 至此,資料庫連線池的配置與使用成功!

  2. 常見問題及解決方案:

  • 如果配置什麼的都沒問題的情況下出現等待連線,連線超時的情況,那就要檢查一下資料庫服務是否啟動
  • 如果出現: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依賴包、資料庫服務沒啟動,配置的資料庫連線路徑出錯的問題,沿著這幾個思路去解決問題就行了。如果有其他問題,歡迎下方給我留言!