一、什么是数据库连接池
数据库连接是一种关键的、有限的、昂贵的资源。每次用户获取数据库连接都需要消耗较大的资源,数据库连接池可以管理连接,可以重复使用连接而不需要每次都进行创建。使用池来管理连接的生命周期,可以节省资源,提高性能。用池来管理Connection,这可以重复使用Connection。有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。数据库连接池的原理通俗地说:先创建好几个数据库放在池里,等系统需要用了直接去连接,并做上标记(连接),用完后再将数据库连接还回到池里,同时做上标记(空闲)。当有连接需求时,此时又没有空闲数据库连接,则会新建立连接放入池中。而这些参数我们都可以自己进行配置,如:
- 初始大小:10个
- 最小空闲连接数:3个
- 增量:一次创建的最小单位(5个)
- 最大空闲连接数:12个
- 最大连接数:20个
- 最大的等待时间:1000毫秒
二、常见连接池
这里总结下两个常见的连接池:DBCP和c3p0。导包是使用数据库连接池的第一步,
1.DBCP:导jar包,commons-pool.jar、commons-dbcp.jar
DBCP是Apache提供的一款开源免费的数据库连接池。
public void demo1() throws SQLException { //导入核心类:BasicDataSource BasicDataSource ds = new BasicDataSource(); //基本配置 ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql://localhost:3306/mydb1"); ds.setUsername("root"); ds.setPassword("123"); //最大连接数 ds.setMaxActive(20); //最大空闲连接数:表示即使没有数据库连接时依然可以保持10个空闲的连接,而不被清除,随时处于待命状态。设 0 为没有限制。 ds.setMaxIdle(10); //初始化连接数 ds.setInitialSize(10) ; //最小空闲连接数 ds.setMinIdle(2) ; //最大等待毫秒数 ds.setMaxWait(1000) ; Connection con = ds.getConnection(); //只是将连接归还池 con.close() ; }
2.c3p0:导jar包,c3p0-0.9.2-pre1.jar、c3p0-oracle-thin-extras-0.9.2-pre1.jar、mchange-commons-0.2.jar
c3p0也是开源免费的连接池!
public void demo2() throws PropertyVetoException, SQLException { //导入核心类:ComboPooledDataSource ComboPooledDataSource ds = new ComboPooledDataSource(); //基本配置 ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1"); ds.setUser("root"); ds.setPassword("123"); //每次的增量为5 ds.setAcquireIncrement(5) ; //初始化连接数为20 ds.setInitialPoolSize(20) ; //最少连接数为2 ds.setMinPoolSize(2) ; //最大连接数为50 ds.setMaxPoolSize(50) ; Connection con = ds.getConnection(); //只是将连接归还池 con.close(); }
使用配置文件进行连接,有两个要求:(1)配置文件:c3p0-config.xml;(2)文件位置:src下
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">123</property> <property name="acquireIncrement">3</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">2</property> <property name="maxPoolSize">10</property> </default-config> </c3p0-config>
c3p0的配置文件中可以配置多个连接信息,可以给每个配置起个名字,这样可以方便的通过配置名称来切换配置信息。上面文件中默认配置为mysql的配置,名为test-config的配置也是mysql的配置。此时可以使用有参构造器进行指定配置信息:ComboPooledDataSource ds = new ComboPooledDataSource("test-config") 。
<named-config name="test-config"> <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">123</property> <property name="acquireIncrement">3</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">2</property> <property name="maxPoolSize">10</property> </named-config>
文末:不知道大家有没有对c3p0这个连接池名字好奇,网上查了下c3p0的全称,发现了一个小故事:
据传闻:c3p0连接池作者是《星球大战》迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字。C3P0就是下图中的右边的那个机器人。左边是他哥哥R2D2。(小故事来源:https://blog.csdn.net/wang_xuaohao/article/details/8565864)
来源:https://www.cnblogs.com/shengwangmei/p/9328423.html