C3P0连接池
2020-02-18 本文已影响0人
KenChen_939
为什么要使用C3P0连接池?
一般我们在项目中操作数据库的时候,都是每次需要操作数据库的时候就建立一个连接,操作完成后释放连接。也就是说他在每次操作的时候都需要自己连接数据库,还需要关闭数据库,性能太差了。若使用C3P0连接池来池化连接,随时取用,则平均每次取用只需要10-20毫秒。这在高并发随机访问数据库的时候对效率的提升有很大帮助。
C3P0连接池会根据你的配置来初始化N个数据库连接,空闲T时间后连接过期又会自动新建K个连接使得连接池总有空闲的数据库连接等待被取用。我们只需通过dataSourse.getConnection()即可从线程池中取用一个已经连接好的空闲连接,执行数据库操作。然后“断开”(放回)这个连接,把这个连接的使用权放回连接池。真正的数据库连接的创建与释放是由C3P0在后台自动完成的,我们花的只是取用与释放占用权的时间。
范例:在src下建立一个database.properties文件
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://www.cjlly.com:3306/chen
db.user=user_chen
db.password=123456
pool.max=100
pool.min=10
pool.init=10
pool.idle=20
而现在需要在spring-config.xml文件中取得这些配置的内容。
范例:修改xml文件,使用C3P0数据库连接池
<context:property-placeholder location="classpath:database.properties"/>
<!-- 在本程序之中设置要导入的资源文件路径,直接通过classpath加载。—>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
<!-- 此时表示jdbcTemplate与Datasource就通过配置文件搭配完成-->
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${db.driver}"/>
<property name="jdbcUrl" value="${db.url}"/>
<property name="password" value="${db.password}"/>
<property name="user" value="${db.user}"/>
<property name="maxPoolSize" value="${pool.max}"/> <!-- 最大的可用连接数 -->
<property name="initialPoolSize" value="${pool.init}"/> <!--初始化连接数 -->
<property name="minPoolSize" value="${pool.min}"/> <!--最小维持的连接数 -->
<property name="maxIdleTime" value="${pool.idle}"/> <!--最大的等待连接 -->
</bean>
现在就可以正常使用C3P0连接池了:
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config.xml");
INewsDAO dao = ctx.getBean("newsDAOImpl", NewsDAOImpl.class);
News vo = new News();
vo.setTitle("天气炎热");
vo.setContent("今天注意身体");
vo.setPubdate(new Date());
System.out.println(dao.doCreate(vo));
}