数据库连接池

img

数据库连接池

  1. 数据库的连接对象创建工作,比较消耗性能。
  2. 一开始现在内存中开辟一块空间(集合) ,先往池子里面放置 多个连接对象。
    后面需要连接的话,直接从池子里面取,不用自己创建连接了。
    使用完毕, 要记得归还连接。确保连接对象能循环利用。

在这里插入图片描述


开源连接池

DBCP, c3p0

DBCP(DataBase Connection Pool)数据库连接池

是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开

  1. 导入jar文件
    commons-dbcp-1.4.jar;
    commons-pool-1.5.6.jar
  2. 不使用配置文件:
public class DBCPDemo {
	public void testDBCP01(){

		Connection conn = null;
		PreparedStatement ps = null;
		
		try {
			
			//1. 构建数据源对象
			BasicDataSource dataSource = new BasicDataSource();
			
			//连的是什么类型的数据库, 访问的是哪个数据库 , 用户名, 密码。。
			//jdbc:mysql://localhost/bank 主协议:子协议 ://本地/数据库
			dataSource.setDriverClassName("com.mysql.jdbc.Driver");
			dataSource.setUrl("jdbc:mysql://localhost/bank");
			dataSource.setUsername("root");
			dataSource.setPassword("root");
			
			//2. 得到连接对象
			conn = dataSource.getConnection();

//
			String sql = "insert into account values(null , ? , ?)";
//
			ps = conn.prepareStatement(sql);
			ps.setString(1, "admin");
			ps.setInt(2, 1000);
			
			ps.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.release(conn, ps);
		}
		
	}
}
  1. 使用配置文件方式:

dbcpconfig.properties

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bank
username=root
password=root

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
	Connection conn = null;
	PreparedStatement ps = null;
	try {
		BasicDataSourceFactory factory = new BasicDataSourceFactory();
		//Properties
		Properties properties = new Properties();
		//InputStream 
		InputStream is = new FileInputStream("src//dbcpconfig.properties");
		properties.load(is);
		DataSource dataSource = factory.createDataSource(properties);
		
		//2. 得到连接对象
		conn = dataSource.getConnection();
//sql
		String sql = "insert into account values(null , ? , ?)";
		ps = conn.prepareStatement(sql);
		ps.setString(1, "liangchaowei");
		ps.setInt(2, 100);
		
		ps.executeUpdate();
		
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		JDBCUtil.release(conn, ps);
	}

C3P0

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

拷贝jar文件 c3p0-0.9.1.2.jar

不使用配置文件方式
	Connection conn = null;
	PreparedStatement ps = null;
	try {
		//1. 创建datasource
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		//2. 设置连接数据的信息
		dataSource.setDriverClass("com.mysql.jdbc.Driver");
		
		dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");
		dataSource.setUser("root");
		dataSource.setPassword("root");
		
		//2. 得到连接对象
		conn = dataSource.getConnection();
		
		String sql = "insert into account values(null , ? , ?)";
		ps = conn.prepareStatement(sql);
		ps.setString(1, "admi234n");
		ps.setInt(2, 103200);
		
		ps.executeUpdate();
		
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		JDBCUtil.release(conn, ps);
	}
使用配置文件方式

c3p0的配置文件 支持 properties , 也支持 xml 方式。 不过开发中,一般使用xml方式来配置

  1. src下, 创建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/bookstore
		
		</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<!-- 初始化连接池数量 -->
		<property name="initialPoolSize">10</property>
		
		<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
		<property name="maxIdleTime">60</property>

		<!--连接池中保留的最大连接数。Default: 15 -->
		<property name="maxPoolSize">25</property>
		
		<!--连接池中保留的 最小连接数.Default: 3 -->
		<property name="minPoolSize">10</property>
	</default-config>
</c3p0-config>

	
  1. 代码中获取连接child对象

ComboPooledDataSource dataSource = new ComboPooledDataSource();
示例:

	public class C3P0Demo02 {

	@Test
	public void testC3P0(){
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			
			//就new了一个对象。
			//默认会找 xml 中的 default-config 分支。
			ComboPooledDataSource dataSource = new ComboPooledDataSource();
			
			//2. 得到连接对象
			conn = dataSource.getConnection();
//
			String sql = "insert into account values(null , ? , ?)";
			ps = conn.prepareStatement(sql);
			ps.setString(1, "wangwu2");
			ps.setInt(2, 2600);
			
			ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.release(conn, ps);
		}
	}
}

使用c3p0的JDBCUtil类

public class JDBCUtil {
	
	static ComboPooledDataSource dataSource = null;
	static{
		dataSource = new ComboPooledDataSource();
	}
	
	/**
	 * 获取连接对象
	 * @return
	 * @throws SQLException 
	 */
	public static Connection getConn() throws SQLException{
		return dataSource.getConnection();
	}
	
	/**
	 * 释放资源
	 * @param conn
	 * @param st
	 * @param rs
	 */
	public static void release(Connection conn , Statement st , ResultSet rs){
		closeRs(rs);
		closeSt(st);
		closeConn(conn);
	}
	public static void release(Connection conn , Statement st){
		closeSt(st);
		closeConn(conn);
	}

	
	private static void closeRs(ResultSet rs){
		try {
			if(rs != null){
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			rs = null;
		}
	}
	
	private static void closeSt(Statement st){
		try {
			if(st != null){
				st.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			st = null;
		}
	}
	
	private static void closeConn(Connection conn){
		try {
			if(conn != null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			conn = null;
		}
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值