數據庫連接池DBCP和C3P0

連接池


實際開發中“獲得連接”或“釋放資源”是非常消耗系統資源的兩個過程,爲了解決此類性能問題,通常情況我們採用連接池技術,來共享連接Connection。這樣我們就不需要每次

都創建連接、釋放連接了,這些操作都交給了連接池。

概念

用池來管理Connection,這樣可以重複使用Connection。有了池,所以我們就不用自己來創建Connection,而是通過池來獲取Connection對象。當使用完Connection後,調

用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池。池就可以再利用這個Connection對象了。

規範

Java爲數據庫連接池提供了公共的接口:javax.sql.DataSource,各個廠商需要讓自己的連接池實現這個接口。這樣應用程序可以方便的切換不同廠商的連接池!

常見的連接池:DBCP、C3P0。


DBCP連接池

DBCP也是一個開源的連接池,是Apache Common成員之一,使用時同樣在項目中導入jar包,即:commons-dbcp-1.4.jar和commons-pool-1.5.6.jar。


編寫工具類

連接數據庫表的工具類,採用DBCP連接池的方式來完成,Java中提供了一個連接池的規則接口:DataSource,在使用DBCP連接池方式時由commons-dbcp-1.4.jar包中定義了

DataSource接口實現類稱爲BasicDataSourceFactory類。

通過properties配置文件和JBDC工具類方便以後維護使用。

代碼實例:

database.properties配置文件

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydatabase
username=root
password=12345678
initialSize=10
maxActive=50
MaxIdle=20
MinIdle=10


工具類JBDCUtils.java:

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

//此類是JDBC工具類,包括獲取連接和釋放資源的方法
//可以結合properties配置文件使用
public class JBDCUtils {
	private static String driverClass;
	private static String url;
	private static String username;
	private static String password;
	
	private static Connection con;
	private static DataSource dataSource;
	//靜態代碼塊加載配置文件信息
	static{
		try{
			//通過類加載器獲得一個輸入流,將配置文件中的數據讀取進來
			InputStream in = JBDCUtils.class.getClassLoader().getResourceAsStream("database.properties");
			//以鍵值對的形式存放在Properties的對象中
			Properties pro = new Properties();
			pro.load(in);
			dataSource = BasicDataSourceFactory.createDataSource(pro);
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	//獲取連接方法
	public static Connection getConnection(){
		try{
			return dataSource.getConnection();
		}catch(Exception e){
			e.printStackTrace();
		}
		return con;
	}
	
	//釋放資源方法
	public static void close(Connection con,Statement stat , ResultSet rs){
		if(rs!=null){
			 try{
				 rs.close();
			 }catch(SQLException ex){
				 ex.printStackTrace();
			 }
		 } 
		 if(stat!=null){
			 try{
				 stat.close();
			 }catch(SQLException ex){
				 ex.printStackTrace();
			 }
		 }
		 if(con!=null){
			 try{
				 con.close();
			 }catch(SQLException ex){
				 ex.printStackTrace();
			 }
		 } 
	}
	
	public static DataSource getDataSource(){
		return dataSource;
	}
}


測試類:

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCtest {
	public static void main(String[] args){
		String sql = "select * from sort";
		Connection con = null;
		try{
			con = JBDCUtils.getConnection();
			Statement stat = con.createStatement();
			ResultSet rs = stat.executeQuery(sql);
			while(rs.next()){
				System.out.println(rs.getInt("sid")+"  "+rs.getString("sname")+"  "+rs.getDouble("sprice")+"  "+rs.getString("sdesc"));
			}
			JBDCUtils.close(con,stat,rs);
 		}catch(Exception e){
			e.printStackTrace();
		}
	}
}



C3P0連接池


使用時首先導入jar包c3p0-0.9.2-pre5.jar和mchange-commons-java-0.2.3jar.再添加配置文件c3p0-config.xml。(非常常用)

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property>
	<property name="user">root</property>
	<property name="password">12345678</property>
	<property name="initialPoolSize">5</property>
	<property name="maxPoolSize">20</property>
  </default-config>
  
  <named-config name="oracle"> 
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property>
	<property name="user">root</property>
	<property name="password">12345678</property>
  </named-config>
  
</c3p0-config>


測試類:c3p0test1.java

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class c3p0test1 {
	//使用默認配置,如果要使用連接池,必須創建該類的實例對象
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
	//調用該類中重寫的getConnnection()方法
	public static void main(String[] args) throws Exception{
		Connection con = dataSource.getConnection();
		String sql = "select * from sort";
		Statement stat = con.createStatement();
		ResultSet rs = stat.executeQuery(sql);
		while(rs.next()){
			System.out.println(rs.getInt("sid")+"  "+rs.getString("sname")+"  "+rs.getDouble("sprice")+"  "+rs.getString("sdesc"));
		}
		rs.close();
		stat.close();
		con.close();
	}
}



















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章