C3P0的一些简单见解及使用!

一、C3P0介绍

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

二、maven管理pom.xml中C3P0的支持包

数据库连接大前提是:①连接mysql数据库的驱动包,连接oracle数据库的驱动包,以及相关的配置。

                                     ②C3P0的jar包



    com.mchange
	mchange-commons-java
	0.2.3.4

三、主要使用的类:ComboPooledDataSource 

这里说下连接数据库常用类,它们之间的区别:

①DataSource是javax.sql.DataSource是sun公司为java和数据库连接提供的一种接口规范,比如原生的jdbc连接。

②BasicDataSource是dbcp封装了jdbc对dataSource接口的实现。

③ComboPooledDataSource 是c3p0封装了jdbc 对DataSource接口的实现。

四、工具类+解释

核心类:

①ComboPooledDataSource :数据库连接池需实例化的类,通过这个类的实例化对象去连接您想连接的数据,以及设置一些参数。比如:设置连接池的最大/最小连接数等等,这个看需求可任意添加,具体相关需另行查阅资料。

②InputStream :通过这个类去获取xxxxx.properties文件的相关属性,比如:驱动driver属性,数据库路径URL属性,用户名

username属性,密码password属性,以及其他一些配置等等...

XXX.class.getClassLoader().getResourceAsStream("YYY"),XXX是写此方法的类名,YYY是连接数据库的配置文件。

③Properties : 通过这个类的实例化对象所带的方法.load()去解析InputStream,然后.getProperty("xxx")获取配置文件的相应

属性。

④Connection + PreparedStatement + ResultSet:jdbc需实现的类

package com.todaychina.hempdrugs.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3p0MYLUtil {

	private static ComboPooledDataSource ds;	
	//静态初始化块进行初始化
	static{
		try {
			ds = new ComboPooledDataSource();//创建连接池实例
			Properties prop = new Properties();	
			InputStream is = C3p0MYLUtil.class.getClassLoader().getResourceAsStream("dbconfigMedjk.properties");
			prop.load(is);		
			is.close();
			ds.setDriverClass(prop.getProperty("jdbc.url"));//驱动
			ds.setJdbcUrl(prop.getProperty("jdbc.url"));//URL
			ds.setUser(prop.getProperty("jdbc.username"));//用户名
			ds.setPassword(prop.getProperty("jdbc.password"));//密码
			ds.setMaxPoolSize(40);//连接池的最大连接数
			ds.setMinPoolSize(2);//连接池的最小连接数
			ds.setInitialPoolSize(10);//连接池的初始连接数
			ds.setMaxStatements(100);//连接池的缓存Statement的最大数				
		} catch (Exception e) {
			e.printStackTrace();
		}					
	}
	//获取与指定数据库的连接
	public static ComboPooledDataSource getInstance(){
		return ds;
	}	
	//从连接池返回一个连接
	public static Connection getConnection(){
		Connection conn = null;
		try {
			conn = ds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}	
	//释放资源
	public static void realeaseResource(ResultSet rs,PreparedStatement ps,Connection conn){
		if(null != rs){
			try {
				rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		if(null != ps){
			try {
				ps.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		try {
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}	
	
}

五、具体使用这个C3P0工具类

说明:这是是接口的实现方法示例

public List> getMedOperation(String username) {
	// TODO Auto-generated method stub		
	List> mapList = new ArrayList>();		
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet resultSet = null;
        try { 
            //获取连接
        	conn = C3p0MYLUtil.getConnection();
        	//获取数据库数据
            String sql = "sql语句获取连接数据库上的数据";                     
            ps = conn.prepareStatement(sql);
        	//转换遍历结果集
            resultSet = ps.executeQuery();        
        	while (resultSet.next()){
        		//示例
            	Map map = new HashMap();         
            	map.put("key", resultSet.getString("sql查询出数据的字段属性"));                           
                mapList.add(map);  
                }             
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭资源         
            C3p0MYLUtil.realeaseResource(resultSet, ps, conn); 
        }
        return mapList;               
	}

若对你有所帮助请点个赞!

补充:  若想连接不同的数据库,只需多写几个不同dbconfig.properties的配置文件,然后工具类把静态代码块放入到获得指定连接的方法中即可!   下面是在上面的基础上更改完的示例,传参为"dbconfig.properties",是字符串需外面有双引号。

package com.todaychina.hempdrugs.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3p0MYLUtil {

	private static ComboPooledDataSource ds;	
/*	//静态初始化块进行初始化
	static{
		try {
			ds = new ComboPooledDataSource();//创建连接池实例
			Properties prop = new Properties();	
			InputStream is = C3p0MYLUtil.class.getClassLoader().getResourceAsStream("dbconfigMedjk.properties");
			prop.load(is);		
			is.close();
			ds.setDriverClass(prop.getProperty("jdbc.driver"));//驱动
			ds.setJdbcUrl(prop.getProperty("jdbc.url"));//URL
			ds.setUser(prop.getProperty("jdbc.username"));//用户名
			ds.setPassword(prop.getProperty("jdbc.password"));//密码
			ds.setMaxPoolSize(40);//连接池的最大连接数
			ds.setMinPoolSize(2);//连接池的最小连接数
			ds.setInitialPoolSize(10);//连接池的初始连接数
			ds.setMaxStatements(100);//连接池的缓存Statement的最大数				
		} catch (Exception e) {
			e.printStackTrace();
		}					
	}
	//获取与指定数据库的连接
	public static ComboPooledDataSource getInstance(){
		return ds;
	}	*/

	//获取与指定数据库的连接
	public static ComboPooledDataSource getInstance(String dbconfig){	
		try {
			ds = new ComboPooledDataSource();//创建连接池实例
			Properties prop = new Properties();	
			InputStream is = C3p0MYLUtil.class.getClassLoader().getResourceAsStream(dbconfig);
			prop.load(is);		
			is.close();
			ds.setDriverClass(prop.getProperty("jdbc.driver"));//驱动
			ds.setJdbcUrl(prop.getProperty("jdbc.url"));//URL
			ds.setUser(prop.getProperty("jdbc.username"));//用户名
			ds.setPassword(prop.getProperty("jdbc.password"));//密码
			ds.setMaxPoolSize(40);//连接池的最大连接数
			ds.setMinPoolSize(2);//连接池的最小连接数
			ds.setInitialPoolSize(10);//连接池的初始连接数
			ds.setMaxStatements(100);//连接池的缓存Statement的最大数				
		} catch (Exception e) {
			e.printStackTrace();
		}					
		
		return ds;
	}	
	//从连接池返回一个连接
	public static Connection getConnection(){
		Connection conn = null;
		try {
			conn = ds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}	
	//释放资源
	public static void realeaseResource(ResultSet rs,PreparedStatement ps,Connection conn){
		if(null != rs){
			try {
				rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		if(null != ps){
			try {
				ps.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		try {
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}	
	
}

 

你可能感兴趣的:(java后端常用方法)