一、 什么是连接池
在JAVA中,我们经常会用到池的概念,比如常量池、线程池、连接池等等。那么池是什么呢,其实就是一个容器,例如数组或者集合。
连接池就是将连接对象(Connection)放在一个容器中,供整个程序共享,可以减少连接创建和关闭的次数,实现连接的复用,提高程序执行的效率。
二、为什么要使用数据库连接池
1.传统方式(不使用连接池):
存在的问题:当通过Java程序连接数据库时,每次都创建连接,并基于连接访问数据库,用完连接后再将连接关闭(销毁),而创建连接和关闭连接需要消耗大量的时间和大量的资源(相对使用连接而言),而且连接得不到服用,导致程序的执行效率低下。
2.使用连接池:
使用C3P0连接池
1.导入c3p0开发包
2.在程序中创建数据库连接池(对象)
ComboPooledDataSource pool = new ComboPooledDataSource();
3.设置数据库连接的基本信息
1)方式一:(不推荐)
//设置连接数据库的基本信息(4个参数)
pool.setDriverClass("com.mysql.jdbc.Driver");
pool.setJdbcUrl("jdbc:mysql:///jt_db?characterEncoding=utf-8");
pool.setUser("root");
pool.setPassword("root");
上面这种方式是将连接参数写死在程序中,如果后期需要修改参数,就得该程序源码,改完后还的重新编译程序,还得重复发布项目,非常麻烦。
因此最好将这些可能经常发生变化的参数,提取到配置文件中。因为配置文件不是java文件,改完后不需要编译,也不会重复发布项目,比如只需要重启服务器,下次读取的就是最新的配置信息。
(2)方式二:(推荐)xml文件
在src(源码)目录下,提供一个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:///jt_db?characterEncoding=utf-8
</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
上面这种方式要求,c3p0-config.xml文件的位置必须是源码目录,编译后会输出到类目录,将来程序执行时会到类的根目录下找指定名称(c3p0-config.xml)的文件,所以不仅位置是固定的,文件名也是固定的。如果位置不对或者文件名不对,即使内容配置再正确,c3p0程序也找不到该文件。
(3)方式三:(推荐)properties文件
在src(源码) 目录下创建一个c3p0.properties文件,文件内容如下:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///jt_db?characterEncoding=utf-8
c3p0.user=root
c3p0.password=root
上面这种方式要求,c3p0.properties文件的位置必须是源码目录,编译后会输出到类目录,将来程序执行时会到类的根目录下找指定名称(c3p0.properties)的文件,所以不仅位置是固定的,文件名也是固定的。如果位置不对或者文件名不对,即使内容配置再正确,c3p0程序也找不到该文件。
4.将连接还回连接池
finally {
/* 如果是自己创建的连接对象, 连接对象没有被修改过, 调用
* conn.close()方法, 就是将连接关闭.
* 如果是 从连接池中获取的一个连接对象, 连接对象其实已经
* 被改造了,其中的close方法内部功能被改成了还连接到
* 连接池中。所以调用conn.close是还连接到连接池。
*/
//释放资源
JdbcUtil.close(conn, stat, rs);
}