注意
因为本人使用的是maven管理jar包依赖,所以就不演示添加jar包的环节,大家可以自行百度一下所需jar包,至于maven管理依赖我会在以后写一篇详解的。
引言
之前JDBC访问数据库的步骤:
创建数据库连接 →运行SQL语句→关闭连接
每次数据库访问执行这样重复的动作。
每次创建数据库连接的问题:
- 1.获取数据库连接需要消耗比较多的资源
每次操作都要重新获取新的连接对象,执行一次操作就把连接关闭,而数据库创建连接通常需要消耗相对较多的资源,创建时间也较长,这样数据库连接对象的使用率低。 - 2.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出。
所以我们需要使用连接池帮我们解决以上问题。
连接池
连接池的概念:连接池是创建和管理数据库连接的缓冲池技术。连接池就是一个容器,连接池中保存了一些数据库连接,这些连接是可以重复使用的。
连接池解决现状问题的原理
- 程序一开始就创建一定数量的连接,放在一个容器中,这个容器称为连接池(相当于碗柜/容器)。
- 使用的时候直接从连接池中取一个已经创建好的连接对象。
- 关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中。
开发中经常使用的连接池有阿里巴巴的德鲁伊Druid和开源的C3P0连接池,今天我就以C3P0作为例子演示一下连接池的使用。
C3P0连接池的使用步骤
其实第一步是导入对应的jar包,我这里就省略了,原因开头就写了
一.配置C3P0的配置文件
因为我是使用的maven所以是在resource目录下创建c3p0-config.xml,不使用maven的小伙伴可以放在源代码即src目录下,要注意,文件名一定要保持一致,C3P0命名配置可以有多个。
<?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/demo</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">2000</property>
<property name="maxIdleTime">1000</property>
</default-config>
</c3p0-config>
大家可以在我这个配置文件上根据需求自行修改。
主要参数
driverclass:数据库驱动,基本上都是一样的。
jdbcUrl:要操作的数据库对象,如果是和我一样操作本地数据库,那么数据库名之前的东西都是不变的。注意是数据库名不是表的名字
initialPoolSize:刚创建好连接池的时候连接数量
maxPoolSize:连接池中最多可以放多少个连接
checkoutTimeout:连接池中没有连接时最长等待时间
maxIdleTime:连接池中的空闲连接多久没有使用就会回收。默认是0,0表示不回收
二.使用C3P0连接池对本地数据库进行操作
基本上还是重复一个套路,注册驱动(c3p0帮我们完成了),获取连接对象,获取预编译对象,预编译sql语句,释放资源
public static void main(String[] args) throws Exception {
// 使用默认配置(default-config)
// 使用无参构造:new ComboPooledDataSource();
ComboPooledDataSource ds = new ComboPooledDataSource();
// 从连接池中取出连接
Connection conn = ds.getConnection();
// 执行SQL语句
String sql = "SELECT * FROM KamenRider";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet resultSet = pstmt.executeQuery();
while (resultSet.next()){
System.out.println(resultSet.getString("username")+":"+resultSet.getString("ridername"));
}
pstmt.close();
conn.close(); // 将连接还回连接池中
}
结果也和之前一样
相信大家也可以推导出,如果执行多个sql语句,代码的重复率过高,所以我们要想办法写出一个工具类来抽取这些语句。