1. 程式人生 > >C3P0、DBCP連線池

C3P0、DBCP連線池

C3P0連線池

  • C3P0是一個開源的JDBC連線池,它實現了資料來源和JNDI繫結,支援JDBC3規範和JDBC2的標準擴充套件。目前使用它的有Hibernate,Spring等。

  • 在src下建立c3p0-config.xml檔案,進行如下配置

<c3p0-config>
	<default-config>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/excel</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="initialPoolSize">5</property>
		<property name="maxPoolSize">10</property>
		<property name="maxIdleTime">100</property>
	</default-config>
</c3p0-config>
  • 使用模板如下,有兩種建立方式
package cn.hsx.edu.c3p0;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * C3p0連線池
 * @author ssk
 *
 */
public class C3p0 {
	
	/**
	 * 使用硬編碼方式,實現C3P0連線
	 */
	@Test
	public void test() throws PropertyVetoException, SQLException {
		//建立連線池核心類
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		//設定連線引數
		dataSource.setJdbcUrl("jdbc:mysql//localhost:8080/excel");
		dataSource.setDriverClass("com.mysql.jdbc.Driver");
                //同戶名
		dataSource.setUser("root");
                //密碼
		dataSource.setPassword("root");
                  //初始化連線數量
		dataSource.setInitialPoolSize(5);
                //最大連線數量
		dataSource.setMaxPoolSize(10);
                 //最大空閒時間
		dataSource.setMaxIdleTime(1000);
		//獲得連線
		Connection  con = dataSource.getConnection();
		
		con.prepareStatement("delete from score where id = 1").executeQuery();
		
		con.close();
	}
	
	/**
	 * 使用c3p0-config.xml配置連線,必須放在src目錄下
	 */
	@Test
	public void testXML() throws SQLException {
		// 建立c3p0連線池核心工具類
		// 自動載入src下c3p0的配置檔案【c3p0-config.xml】
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		//獲得連線
		Connection con = dataSource.getConnection();
		
		String sql = "select * from score where id = ?";
		PreparedStatement stmt = null;
		
		for(int i=0;i<15;i++) {
			stmt = con.prepareStatement(sql);
			stmt.setInt(1, i);
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()) {
				System.out.println(rs.getString("name")+","+rs.getString("address"));
			}
		}
	}
}

DBCP連線池

  • DBCP(DataBase Connection Pool)資料庫連線池,是java資料庫連線池的一種,由Apache開發,通過資料庫連線池,可以讓程式自動管理資料庫連線的釋放和斷開。

  • 在當前目錄下新建db.properties檔案,如下

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/excel
username=root
password=root
initialSize=5
maxActive=10
maxIdle=3000
  • 使用模板如下,有兩種實現方式
package cn.hsx.edu.dbcp;

import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;

/**
 * DBCP連線池
 * @author ssk
 */
public class DBCP {

	/**
	 * 硬編碼實現連線
	 */
	@Test
	public void testDbcp1() throws Exception {
              //BasicDataSource是DBCP的核心類
		BasicDataSource dataSource = new BasicDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost/excel");
		dataSource.setUsername("root");
		dataSource.setPassword("root");
		dataSource.setInitialSize(5);// 初始化連線
		dataSource.setMaxActive(10);// 最大連線
		dataSource.setMaxIdle(3000);// 最大空閒時間

		// 獲取連線
		Connection con = dataSource.getConnection();
		con.prepareStatement("delete from score where id = 7").executeUpdate();

		con.close();
		System.out.println("刪除完成");
	}

	/**
	 * 通過Properties配置檔案實現連線
	 */
	@Test
	public void testDbcp2() throws Exception {

		// 載入prop配置檔案
		Properties prop = new Properties();
		// 獲取檔案流
		InputStream inStream = DBCP.class.getResourceAsStream("db.properties");
		// 載入屬性配置檔案
		prop.load(inStream);
		// 根據prop配置,直接建立資料來源物件
		DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
		
		Connection con = dataSource.getConnection();
		
		con.prepareStatement("delete from score where id = 6").executeUpdate();

		con.close();
		System.out.println("刪除完成");	
	}
}