一:连接池介绍
1、操作数据库都需要创建连接,操作完成还需要关闭连接
2、创建连接和关闭连接需要可能比执行sql需要的时间都长
3、一个网站需要高频繁的访问数据库,如果短时间频繁的访问数据库服务器,就容易造成服务器的宕机,即死机。
1.1连接池解决的问题
在以往的jdbc程序每次访问数据库都需要创建一个新的连接,访问完毕之后,还需要释放资源。那么在这样的一个过程中,连接的创建和销毁所消耗的资源是远远大于我们发送sql并执行的时间的。基于这样的情况,我们发现我们的jdbc程序将大量的资源浪费在了连接的创建和销毁上。
举例:就像在上海坐地铁,就一站2分钟的路程,往往在买地铁票的过程需要等待至少10分钟以上的时间。这样是不合理的。所以我们 需要对这样的结构进行优化。
思考上面的结构,大部分的时间浪费在了创建和销毁上。那么我们能不能实现将这些连接回收和利用呢?这样我们就不需要不停的创建和销毁了。只需要创建一次,放在指定的地方。当我们使用的时候,直接从里面拿就行了。用完放回原来的地方。不去销毁,当我再次使用的时候,去拿就行了。而这样的解决方案就是我们需要的。
优化后的结构如下:
说明:首先创建一定数量的连接,然后放到指定的地方。当我们需要获取连接的时候,直接从指定的地方获取。用完了,我们再将连接放回去。这样就能将我们连接的回收利用。并且不用花费大量时间在创建和销毁连接上。
2.常用的数据库连接池
javax.sql.DataSource
表示数据库连接池,DataSource本身只是Sun公司提供的一个接口,没有具体的实现,它的实现由连接池的数据库厂商去实现。我们只需要学习这个工具如何使用即可。
常用的连接池实现组件有以下这些:
- 阿里巴巴-德鲁伊Druid连接池:Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求。
- C3P0是一个开源的JDBC连接池,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。C3P0有自动回收空闲连接功能。
- DBCP(DataBase Connection Pool)数据库连接池,是Apache上的一个Java连接池项目。dbcp没有自动回收空闲连接的功能。
二:c3p0介绍
2.1C3P0介绍:
C3P0 是一个开源的JDBC连接池,目前spring 和 hibernate框架对C3P0是支持的。使用c3p0数据库连接池之前,首先需要在资料中找到如下的jar包,加载到项目
2.2C3P0快速入门
1.常用参数说明
参数 | 说明 |
driverClass | 数据库驱动类。例如:com.mysql.jdbc.Driver |
jdbcUrl | 连接数据库的url地址。例如:jdbc:mysql://localhost:3306/day05_db |
user | 连接数据库的用户名。例如:root |
password | 连接数据库的密码。例如:1234 |
initialPoolSize | 刚创建好连接池的时候连接数量 |
maxPoolSize | 连接池中最多可以放多少个连接 |
2.API介绍
com.mchange.v2.c3p0.ComboPooledDataSource
类表示C3P0的连接池对象,常用2种创建连接池的方式:
1.无参构造,使用默认配置
,
2.有参构造,使用命名配置
public ComboPooledDataSource()
无参构造使用默认配置(使用xml中default-config标签中对应的参数)
public ComboPooledDataSource(String configName)
有参构造使用命名配置(configName:xml中配置的名称,使用xml中named-config标签中对应的参数)
public Connection getConnection() throws SQLException
从连接池中取出一个连接
3.使用步骤
1.导入jar包c3p0-0.9.1.2.jar
2.编写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://数据库名称</property> <property name="user">root</property> <property name="password">1234</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </default-config> <!-- This app is massive! --> <named-config name="xx"> </named-config> </c3p0-config>
3.将配置文件放在src目录下
4.创建连接池对象ComboPooledDataSource
,使用默认配置或命名配置
//创建数据源(连接池对象)对象,自动加载src根路径下c3p0-config.xml ComboPooledDataSource dataSource = new ComboPooledDataSource();
5.从连接池获取对象
1. //获取连接对象 2. Connection conn = dataSource.getConnection();
6.使用对象操作数据库,查询表中所有数据并输出到控制台
//3)创建发送sql的对象 Statement stm = conn.createStatement(); //4)发送sql语句,获取ResultSet结果集 String selectSql="select * from user"; ResultSet rs = stm.executeQuery(selectSql); //5)解析结果集 ArrayList<User> users = new ArrayList<>(); while (rs.next()){ int id=rs.getInt(1); String name=rs.getString("username"); String password=rs.getString(3); User user = new User(); user.setId(id); user.setPassword(password); user.setUserName(name); users.add(user); } System.out.println(users);
7.关闭资源
1. //6)close 归还连接对象到连接池 2. rs.close(); 3. stm.close(); 4. conn.close();
三:使用总结
1.使用事项注意
C3P0配置文件名称必须为
c3p0-config.xml
C3P0命名配置可以有多个
2.使用C3P0的优点
1. 高效性:C3P0数据库连接池通过最小化数据库连接的创建和释放操作,提供快速和高效的数据库连接,从而显著提高了系统的响应速度和性能。
2. 连接管理:C3P0数据库连接池可以自动管理和监控连接的可用性和状态,包括连接的创建、分配、回收和销毁等操作,减轻了开发人员的工作负担。
3. 连接重用:C3P0数据库连接池可以重用已经建立的数据库连接,避免每次都重新创建连接,从而减少了数据库的负载和开销。
4. 连接池配置:C3P0数据库连接池提供了丰富的配置选项,可以根据具体的需求进行灵活的配置,包括最大连接数、最小连接数、连接超时等参数的设置。
5. 连接缓存:C3P0数据库连接池可以缓存数据库连接,避免了频繁地创建和销毁连接的开销,提高了数据库操作的效率。
6. 连接错误处理:C3P0数据库连接池可以处理连接异常和错误情况,包括连接超时、连接池溢出等,提供了容错机制,保证了系统的稳定性和可靠性。
7. 连接监控:C3P0数据库连接池可以监控连接的使用情况和状态,包括连接的活跃数、空闲数等,提供了连接池的性能统计和监控功能。
8. 跨平台兼容性:C3P0数据库连接池是一个开源的Java库,可以在不同的操作系统和数据库系统上使用,具有良好的跨平台兼容性。