JDBC连接池-c3p0

    一个数据库连接对象对应着一个物理数据库连接,使用完后关闭连接。频繁的打开关闭连接会造成系统的性能低下,且可能造成数据库的缓存溢出,通常开发中使用连接池(严格来说叫做数据源:DataSource)来进行处理。

连接池的解决方案是:当应用程序启动时,系统主动建立足够的数据库连接,并将它们组成连接池,每次应用请求数据库连接时,无需创建连接,而是从连接池中取出一个已有的连接,使用完后,也不用关闭连接,而是归还给连接池。

连接池的使用很容易理解:原本直接从数据库获得连接,现在改为从连接池获得连接。使用之前,先把连接池对象连接到数据库,然后从连接池对象获得连接即可。

C3P0连接池的用法步骤简述为(首先导入c3p0-x.x.x.x.jar):

1:创建连接池实例:CombopooledDataSource ds = new CombopooledDataSource();

2:设置连接池连接数据库需要的驱动:ds.setDriverClass("com.mysql.jdbc.Driver");

3:连接池连接到数据库:

  设置数据库url:ds.setJdbcUrl("jdbc:mysql://localhost/xxxx");

  设置用户名:ds.setUser("root");

  设置密码:ds.setPassword("123456");

  设置连接池最大连接数:ds.setMaxPoolSize(x);

  设置连接池最小连接数:ds.setMinPoolSieze(x);

  设置连接池初始连接数:ds.setInitialPoolSize(x);

  设置连接池缓存Statement的最大数:ds.setMaxStatements(x);

4:连接池创建完成后,当使用时,使用ds.getConnection()即可获得连接对象。其余操作和之前类似。

代码如下。其中,JDBCUtils[2]为抽取出的工具类,这里不再展示。

package com.imooc.jdbc.demo3;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.junit.Test;

import com.imooc.jdbc.utils.JDBCUtils;
import com.imooc.jdbc.utils.JDBCUtils2;
import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 连接池的测试类
 * @author jt
 *
 */
public class DataSourceDemo1 {
	@Test
	/**
	 * 使用配置文件的方式
	 */
	public void demo2(){
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try{
			/*// 获得连接:
			ComboPooledDataSource dataSource = new ComboPooledDataSource();*/
			// 获得连接:
			// conn = dataSource.getConnection();
			conn = JDBCUtils2.getConnection();
			// 编写Sql:
			String sql = "select * from user";
			// 预编译SQL:
			pstmt = conn.prepareStatement(sql);
			// 设置参数
			// 执行SQL:
			rs = pstmt.executeQuery();
			while(rs.next()){
				System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			JDBCUtils2.release(rs, pstmt, conn);
		}
	}

	@Test
	/**
	 * 手动设置连接池
	 */
	public void demo1(){

		// 获得连接:
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try{
			// 创建连接池:
			ComboPooledDataSource dataSource = new ComboPooledDataSource();
			// 设置连接池的参数:
			dataSource.setDriverClass("com.mysql.jdbc.Driver");
			dataSource.setJdbcUrl("jdbc:mysql:///jdbctest");
			dataSource.setUser("root");
			dataSource.setPassword("abc");
            //设置最大连接数
			dataSource.setMaxPoolSize(20);
            //初始连接数
			dataSource.setInitialPoolSize(3);
			
			// 获得连接:
			conn = dataSource.getConnection();
			// 编写Sql:
			String sql = "select * from user";
			// 预编译SQL:
			pstmt = conn.prepareStatement(sql);
			// 设置参数
			// 执行SQL:
			rs = pstmt.executeQuery();
			while(rs.next()){
				System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			JDBCUtils.release(rs, pstmt, conn);
		}
	}
}

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:///jdbctest</property>
	<property name="user">root</property>
	<property name="password">abc</property>
	<property name="initialPoolSize">5</property>
	<property name="maxPoolSize">20</property>
  </default-config>
  
</c3p0-config>

连接池常使用配置文件配置进行配置。具体内容详细看代码

猜你喜欢

转载自blog.csdn.net/wargon/article/details/81088766