一. java对于C3P0链接池的详解
1.1 C3P0是什么?
c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。
1.2 C3P0工作原理
开源JDBC连接池C3P0连接池在程序操作数据库之前根据配置文件创建一定数量的连接。当线程需要时,它会直接删除连接,从而缩短创建连接的时间。使用连接时,它会释放连接并将其放回连接池。如果连接池中的连接用完,程序将根据配置文件中配置的数据创建另一批,并在使用后将其放回连接池中,关闭连接是不正确的。
1.3 C3P0的特点
1.资源的高效利用
2.更快的系统反应速度
3.减少了资源独占的风险
4.统一的连接管理,避免数据库连接泄露
5.C3P0有自动回收空闲连接功能
二.C3P0简单Demo
实验名称:数据库连接池与DBUtils工具。
实验要求:掌握数据库连接池与DBUtils工具的使用方法。
依赖的包:
- c3p0-0.9.5.2.jar
- mchange-commons-java-0.2.15.jar
- mysql-connector-java-8.0.11.jar
1.新建c3p0-config.xml文件,这个是简单的配置。
在src根目录下创建一个c3p0-config.xml文件,用于设置数据库的连接信息和数据源的初始化信息。
注意,在标准的meaven项目中,c3p0-config.xml一个新建在resources文件夹下:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/school_work?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>
2.在项目的src目录下,创建一个名为utils的包,然后在该包下创建C3p0Utils类,该类用于创建数据源。
private static DataSource ds;
static {
ds = new ComboPooledDataSource();
}
public static DataSource getDataSource() {
return ds;
}
3.创建Curriculum实体类,作用于封装该对象:
private int id;
private String curriculumName;
private double price;
private String introduction;
数据库如下:
4.创建DBUtilsDao类;
在项目的src目录下,然后在该包下创建一个DBUtilsDao类,该类实现了对user表增删改查的基本操作。
- 查询所有,返回List集合,创建QueryRunner对象,写SQL语句
public List findAll() throws SQLException {
QueryRunner runner =new QueryRunner(C3p0Utils.getDataSource());
String sql ="select * from curriculum";
List list =(List) runner.query(sql,
new BeanListHandler(Curriculum.class));
return list;
}
- 查询单个,返回对象。创建QueryRunner对象,写SQL语句。
public Curriculum find(int id) throws SQLException{
QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
String sql ="select * from curriculum where id=?";
Curriculum curriculum =(Curriculum) runner.query(sql,
new BeanHandler(Curriculum.class),new Object[] {id});
return curriculum;
}
-
添加用户的操作,创建QueryRunner,写SQL语句。
public Boolean insert(Curriculum curriculum) throws SQLException{ QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource()); String sql = "insert into curriculum (id,curriculumName,price,introduction) values (?,?,?,?)"; int num =runner.update(sql, new Object[] {curriculum.getId(), curriculum.getCurriculumName(), curriculum.getPrice(),curriculum.getIntroduction() }); if (num>0) return true; return false; }
-
修改用户的操作,创建QueryRunner对象,写SQL语句。
public Boolean update(Curriculum curriculum) throws SQLException{
QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
String sql="update curriculum set curriculumName=?,price=?,introduction=? where id=?";
int num =runner.update(sql,new Object[] {curriculum .getCurriculumName(), curriculum.getPrice(),curriculum.getIntroduction(),curriculum.getId()});
if (num>0)
return true;
return false;
}
- 删除用户的操作,创建QueryRunner对象,写SQL语句。
public Boolean delete(int id) throws SQLException{
QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
String sql = "delete from curriculum where id=?";
int num=runner.update(sql,id);
if(num>0)
return true;
return false;
}
2.1 增加CreateDemo
5.写添加数据库的类:对增加操作进行测试。
创建类:CreateDemo
Curriculum curriculum =new Curriculum();
curriculum.setId(3);
curriculum.setCurriculumName("Springboot基础学习课程");
curriculum.setPrice(99);
curriculum.setIntroduction("包含Springboot基础的全套学习课程");
boolean b =dao.insert(curriculum);
System.out.println(b);
}
public static void main(String[] args) throws SQLException{
testInsert();
}
执行结果图:
2.2 删除DeleteDemo
-
写删除数据库的类。testdelete。
public static void testdelete() throws SQLException { boolean b =dao.delete(5); System.out.println(b); } public static void main(String[] args) throws SQLException{ testdelete(); }
测试结果如下:
2.3 更新 UpdateDemo
7.写一个更新目标类。代码如下:
public static void testupdate() throws SQLException {
Curriculum curriculum = new Curriculum();
curriculum.setId(1);
curriculum.setCurriculumName("更改完成");
curriculum.setPrice(200);
curriculum.setIntroduction("包含java基础的全套学习课程");
boolean b =dao.update(curriculum);
System.out.println(b);
}
public static void main(String[] args) throws SQLException{
testupdate();
}
测试结果如下:
2.4 查找 FindDemo
8.读取目标数据库里存储的内容,过程如下:
public static void testfind() throws SQLException {
Curriculum curriculum = dao.find(1);
System.out.println("id为:"+curriculum.getId()+"课程名为:"+curriculum.getCurriculumName()+"价格为:"
+curriculum.getPrice()+"课程介绍:"+curriculum.getIntroduction());
}
public static void main(String[] args) throws SQLException{
testfind();
}
测试结果如下: