c3p0的配置及簡單應用
首先簡單瞭解一下JDBC和c3p0
Java資料庫連線,(Java Database Connectivity,簡稱JDBC)是Java語言中用來規範客戶端程式如何來訪問資料庫的應用程式介面,提供了諸如查詢和更新資料庫中資料的方法。JDBC也是Sun Microsystems的商標。我們通常說的JDBC是面向關係型資料庫的。
C3P0是一個開源的JDBC連線池,它實現了資料來源和JNDI繫結,支援JDBC3規範和JDBC2的標準擴充套件。目前使用它的開源專案有Hibernate、Spring等。
在JDBC專案中,如果需要多個連線,如果一直獲取連線再斷開連線,會造成資源的極大浪費和佔用。而在c3p0專案中,c3p0它有一個數據庫池是用來管理客戶端和資料庫連線(Connection),有了這個池我們就不用自己來建立Connection,也不用擔心頻繁的連線斷開操作造成的系統資源浪費很大,通過池來獲取Connection物件,當使用完後,進行的資源釋放c3po_utils.release(rs,conn,pstm)並不是直接把程序直接關掉,而是把從連線池佔用的資源又還回去給池。
配置c3p0
首先
下載官網c3p0:https://sourceforge.net/projects/c3p0/
開啟下載好的c3p0資料夾下的lib目錄,可以看到c3p0-0.9.5.5.jar和mchange-commons-java-0.2.19.jar兩個jar包
這裡以IDEA為例
第二步,成功匯入包後,我們配置一下c3p0的配置檔案,c3p0不在properties檔案中配置,而是在xml中配置
在src下新建c3p0_config.xml檔案
在新建好的c3p0_config.xml中加入配置
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- 預設配置,如果沒有指定則使用這個配置 --> <default-config>
//以下是資料庫使用者名稱、密碼、被操作的資料表名地址、驅動類 <property name="user">root</property> <property name="password">root</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/users</property> <property name="driverClass">com.mysql.jdbc.Driver</property> //最大連線數、最小連線數、一次增長個數、初始可連線數 <property name="maxPoolSize">100</property> <property name="minPoolSize">2</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">3</property> //最大等待連線時間、空閒連線測試個數、最大空閒時間、最大預快取數 <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</property> <property name="maxIdleTime">30</property> <property name="maxStatements">200</property> </default-config> <!-- 命名的配置,可以通過方法呼叫實現 --> <named-config name="Mysql"> <property name="user">root</property> <property name="password">root</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/users?useUnicode=true&characterEncodeing=utf8&useSSL=true</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <!-- 如果池中資料連線不夠時一次增長多少個 --> <property name="acquireIncrement">5</property> <!-- 初始化資料庫連線池時連線的數量 --> <property name="initialPoolSize">20</property> <!-- 資料庫連線池中的最大的資料庫連線數 --> <property name="maxPoolSize">25</property> <!-- 資料庫連線池中的最小的資料庫連線數 --> <property name="minPoolSize">5</property> </named-config> </c3p0-config>
編寫c3p0工具類utils
package com.lsq.Utils_Study.Utils; import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class c3p0_Utils { public static DataSource dataSource = null; static { try { //建立資料來源工廠模式 dataSource = new ComboPooledDataSource("Mysql");//配置檔案寫法 }catch (Exception e){ e.printStackTrace(); } } //獲取連線 public static Connection getConnection() throws SQLException{ return dataSource.getConnection();//從資料來源中獲取連線 } //釋放系統資源 public static void release(ResultSet rs, Connection conn, PreparedStatement pstm){ if (rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pstm!=null){ try { pstm.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
測試c3p0連線是否成功
package com.lsq; import com.lsq.Utils_Study.Utils.c3p0_Utils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class c3p0_test { public static void main(String[] args) { Connection conn = null; PreparedStatement pstm = null; ResultSet rs = null; try { conn = c3p0_Utils.getConnection(); String sql = "select * from users where id=?"; pstm = conn.prepareStatement(sql); pstm.setInt(1,1); rs = pstm.executeQuery(); if (rs.next()){ System.out.println("查詢成功"); System.out.println(rs.getString("NAME")); } } catch (SQLException e) { e.printStackTrace(); }finally { c3p0_Utils.release(rs,conn,pstm); } } }