数据库连接池:C3P0

数据库连接池

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。

当一个连接通道使用完后,系统并不会将其释放,而是将它存储在连接池里。下次需要使用连接通道的时候,系统会判断连接池里是否有空闲的连接通道对象。如果有,设置其连接字符串,修改其连接状态,重新使用。

而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

调用close()方法并不是真正关闭连接,而是将连接返回给连接池,避免重复创建,提升性能

在这里插入图片描述
在这里插入图片描述

C3P0:是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate 一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。目前使用它的开源项目有Hibernate,Spring等。
c3p0默认自动回收空闲连接功能。

加入C3P0连接池:
1.配置文件:必须在src下导入c3p0-config.xml 这个文件(规范)

2.导入相关jar包:先在项目中创建一个lib文件夹,再将下面两个jar包导入,再选中这两个jar包,单击右键,选择Build path的Add to Build patrh
(1)c3p0-0.9.2-pre1.jar
(2)mchange-commons-0.2.jar
注意:导入包时,两个包的版本也是需要匹配的
不然会报错:Exception in thread “main” java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector

在这里插入图片描述

3、在类目录下加入C3P0的配置文件:c3p0-config.xml,即在项目根目录下读取文件
注意:配置文件中有两种内容相似的配置,一种缺省配置,意思是在没有指定配置文件名时,调用该配置,一种命名配置,也就是在使用配置文件时,加上配置名即可引用,如接下来会说的:new ComboPooledDataSource(“MySQL”);
如下图为缺省配置
在这里插入图片描述
命名配置
在这里插入图片描述

jdbcUtils_C3P0:
与上一篇的JDBC连接相比明显可以看到代码量少了很多

import java.sql.Connection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.hpe.bean.Stu;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Test1 {

public static void main(String[] args) throws Exception {

	// 创建连接池,ComboPooledDataSource()对象就可以获得数据源
	ComboPooledDataSource ds = new ComboPooledDataSource();
	
	//获取连接
	Connection conn = ds.getConnection();
	
	//准备SQL语句
	String sql = "select * from stu where age>?";
	
	//运用PreparedStatement工具,发送SQL语句
	PreparedStatement pstmt=conn.prepareStatement(sql);
	
	//设置SQL语句的参数
	pstmt.setInt(1, 15);
	
	//executeQuery()返回的是一个结果集
	ResultSet rst =	pstmt.executeQuery();
	
	//处理结果---保存多条数据的集合  在控制台打印查询到的结果
	//当调用new ArrayList<>()时,将一个空数组{}赋值给了elementData,这个时候集合的长度size为默认长度0
	ArrayList<Stu> stus=new ArrayList<Stu>();
	while(rst.next()){
		//处理每一行的内容---处理每一列的内容
		int sid = rst.getInt("sid");
		String sname = rst.getString("sname");
		int age = rst.getInt("age");
		String gander = rst.getString("gander");
		String province = rst.getString("province");
		int tuition = rst.getInt("tuition");

		//rst--->ArrayList 
		//将每一列信息封装到实体类中
		Stu stu = new Stu();
		stu.setSid(sid);
		stu.setSname(sname);
		stu.setAge(age);
		stu.setGander(gander);
		stu.setProvince(province);
		stu.setTuition(tuition);
		
		stus.add(stu);
		System.out.println(stu);
	}
	//关闭连接
	rst.close();
	pstmt.close();
	conn.close();
	
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值