目录
1 为什么要使用数据库连接池
JDBC使用时,会创建数据库连接Connection对象,使用完毕后,再将这个对象销毁掉,而每次创建和销毁数据库连接对象都是需要耗费时间的,因此需要优化数据库的连接过程,提高效率。
优化思路:程序初始化的时候,初始化多个连接,将多个连接放入到池(集合)中,每次获取的时候,直接从连接池中获取连接对象,使用结束后,将连接归还到池中。
数据库连接池思想如上图所示:
(1)程序一开始就创建一定数量的连接,放在一个容器中,这个容器称为连接池(相当于容器)。
(2)使用的时候直接从连接池中取一个已经创建好的连接对象。
(3)关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中。
2 数据库连接池的标准规范
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池,而不必要修改大量代码。
常见的第三方连接池如下:
(1)DBCP(DataBase Connection Pool)数据库连接池,是Apache上的一个Java连接池项目,也是Tomcat使用的连接池组件。dbcp没有自动回收空闲连接的功能。
(2)C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0是异步操作的,所以一些操作时间过长的JDBC通过其它的辅助线程完成。目前使用它的开源项目有Hibernate,Spring等。C3P0有自动回收空闲连接功能。
(3)阿里巴巴-德鲁伊 Druid 连接池:Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求(性能好,常用)。
3 C3P0 连接池的使用
对开发人员来说,学习C3P0很简单,就是从连接池中拿连接来使用而已。
使用步骤:
step1:导入jar包
step2:编写C3P0所要求的配置文件。连接数据库的4大信息是必须的(千万别写在源码中,而是写在配置文件中,读取配置文件也不是我们自己读了,而是C3P0来读,于是这就对配置文件有了要求)
C3P0对于配置文件的要求:
(1)文件名称 c3p0-config.xml
(2)文件放在src下
step3:创建出DataSource接口的实现类
通过实现类的getConnection() 方法获取数据库连接对象,上述步骤的代码实现如下所示:
public class C3p0Utils {
//3、创建出DataSource接口的实现类
//之所以要把连接对象设置为类的静态成员,是因为该类只要进入到内存,就会优先加载其静态成员,于是就会创建接口DataSource的实现类的对象
//该实现类的对象会自动的读取配置文件中的信息,有了该对象,就可以用来获取数据库连接对象了
private static DataSource dataSource = new ComboPooledDataSource(); //这个接口的实现类是直接new出来的,该接口是由C3P0实现的
//提供方法,通过DataSource的实现类对象获取数据库连接对象,调用该方法,就能获取到数据库连接对象
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//定义方法,获取DataSource接口实现类
public static DataSource getDataSource(){
return dataSource;
}
}
public class TestC3p0 {
public static void main(String[] args) throws SQLException {
//测试C3P0连接池:通过工具类获取数据库连接对象
Connection connection = C3p0Utils.getConnection();
System.out.println(connection);
//这里是中间操作:创建sql执行对象、执行sql···
//释放资源:该数据库连接对象不会被销毁,而是又被放回到连接池中了
connection.close();
}
}
注意:C3P0连接池所用到的配置文件是xml格式的,且要保证固定的文件名和存放路径,不能出错,如下图所示:
<?xml version="1.0" encoding="utf-8" ?>
<!--配置数据库连接的4大信息-->
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://ip:port/databasename</property>
<property name="user">my_username</property>
<property name="password">my_password</property>
<!-- 连接池参数(可以不加,有默认数值,该参数主要由运营人员进行维护) -->
<property name="initialPoolSize">5</property>
</default-config>
</c3p0-config>
4 Druid 连接池的使用
阿里巴巴 Druid 数据库连接池
目的:从连接池中获取数据库连接对象
实现步骤:
step1:导入jar包
step2:把数据库连接4大信息放到properties文件中(名字随意,存储位置随意)
step3:创建DataSource接口实现类对象,调用对象方法获取数据库连接对象,上述步骤的代码实现如下所示:
public class DruidUtils {
private static DataSource dataSource;
static {
//自己读取配置文件,用类加载器
InputStream inputStream = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
//把流中的数据存到集合中
Properties properties = new Properties();
try {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
//创建DataSource接口实现类对象(通过工厂类获取,而不是直接new一个对象出来)
try {
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//定义方法,获取连接对象
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
public class TestDruid {
public static void main(String[] args) throws SQLException {
Connection connection = DruidUtils.getConnection();
//测试:是否获取到数据库连接对象
System.out.println(connection);
//释放资源:把连接对象返还给连接池
connection.close();
}
}
注意:Druid连接池所用到的配置文件是properties格式的,无所谓文件名与路径,需要我们先自己读取该配置文件,然后把数据传给Druid,具体操作见上面的代码,配置文件内容如下(4个参数的key值是固定的,不能改名!如果改名了会报错,请注意):
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://ip:port/databasename
username=my_username
password=my_password