JDBC连接池技术及c3p0和dbcp两种连 接池连接DM示例

一、概述

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
数据库连接池负责 分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
在这里插入图片描述

二、优点

1. 资源重用

由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。

2. 更快的系统反应速度

数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间。

3. 新的资源分配手段

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源。

4. 统一的 连接管理,避免数据库连接泄露

在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露。

三、两种数据库连接串技术

JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
DBCP 数据库连接池
C3P0 数据库连接池
DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池
DataSource 用来取代 DriverManager 来获取 Connection,获取速度快,同时可以大幅度提高数据库访问速度。

1. C3P0 连接池连接达梦示例:

需要导入的 jar 包:c3p0-0.9.1.2.jar Dm7JdbcDriver17.jar
配置文件:c3po-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="helloc3p0">
<!-- 数据库连接的 4 个基本信息 -->
<property
name="driverClass">dm.jdbc.driver.DmDriver</property>
<property
name="jdbcUrl">jdbc:dm://192.168.0.117:5236</property>
<property name="user">SYSDBA</property>
<property name="password">SYSDBA</property>
<!-- 涉及数据库连接池管理的其他信息 -->
<!-- 当数据库连接池中的连接不足时,c3p0 数据源一次性向数据库
服务器申请的连接数 -->
<property name="acquireIncrement">5</property>
<!-- 初始化时,数据库连接池中的连接数 -->
<property name="initialPoolSize">10</property>
<!-- 连接池中最少的连接数 -->
<property name="minPoolSize">10</property>
<!-- 数据库连接池中维护的连接数的最大容量 -->
<property name="maxPoolSize">100</property>
<!-- 数据库连接池中,最多维护的 Statement 的个数 -->
<property name="maxStatements">50</property>
<!-- 一次连接中最多可以使用的 Statement 的个数 -->
<property name="maxStatementsPerConnection">2</property>
</named-config>
</c3p0-config>

示例代码(单元测试)

@Test
public void testc3p0_2() throws SQLException {
ComboPooledDataSource cpds = new
ComboPooledDataSource("helloc3p0");
Connection connection = cpds.getConnection();
System. out .println(connection);
}

当然也可以不用配置文件,直接在程序里面设置配置文件里的属性,如设置最大连接数:setMaxPoolSize();

@Test
public void testc3p0_1() throws SQLException, PropertyVetoException {
ComboPooledDataSource cpds = new ComboPooledDataSource();
 cpds.setDriverClass( "dm.jdbc.driver.DmDriver" ); //loads the
jdbc driver
cpds.setJdbcUrl( "jdbc:dm://192.168.0.117:5236" );
cpds.setUser("SYSDBA");
cpds.setPassword("SYSDBA");
//设置最大连接数
cpds.setMaxPoolSize(100);
Connection con = cpds.getConnection();
System. out .println(con);
}

2. dbcp 连接池连接达梦示例:

需要导入的 jar 包:
commons-dbcp-1.4.jar
commons-pool-1.5.5.jar
Dm7JdbcDriver17.jar
配置文件:dbcp.properties

driverClassName=dm.jdbc.driver.DmDriver
url=jdbc:dm://192.168.0.117:5236
username=SYSDBA
password=SYSDBA
defaultAutoCommit=true
initialSize=10

示例代码(单元测试)

@Test
public void testDBCP2_dm() throws Exception {
Properties pros = new Properties();
pros.load(new
FileInputStream("F:\\IdeaProjects\\Java\\src\\dbcp.properties"));
DataSource source =
BasicDataSourceFactory. createDataSource (pros);
Connection conn = source.getConnection();
System. out .println(conn);
}

当然也可以不用配置文件,直接在程序里面设置配置文件里的属性,如设置连接池启动时创建的初始化连接数量:setInitialSize();

@Test
public void testDBCP1_dm() throws SQLException {
BasicDataSource source = new BasicDataSource();
source.setDriverClassName("dm.jdbc.driver.DmDriver");
source.setUrl("jdbc:dm://192.168.0.117:5236");
source.setUsername("SYSDBA");
source.setPassword("SYSDBA");
source.setInitialSize(10);
Connection connection = source.getConnection();
 System. out .println(connection);
}

dbcp 连接池常用基本配置属性

1.initialSize :连接池启动时创建的初始化连接数量(默认值为 0)
2.maxActive :连接池中可同时连接的最大的连接数(默认值为 8,调整为20,高峰单机器在 20 并发左右,自己根据应用场景定)
3.maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为 8 个,maxIdle 不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中 idle 的个数上升超过 maxIdle,而造成频繁的连接销毁和创建,类似于 jvm 参数中的Xmx 设置)
4.minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为 0,调整为 5,该参数越接近 maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于 minidle 个数的连接,类似于 jvm 参数中的 Xmn 设置)
5.maxWait :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1 表示无限等待(默认为无限,调整为 60000ms,避免因线程池不够用,而导致请求被无限制挂起)
6.poolPreparedStatements:开启池的 prepared(默认是 false,未调整,经过测试,开启后的性能没有关闭的好。)
7.maxOpenPreparedStatements:开启池的 prepared 后的同时最大连接数(默认无限制,同上,未配置)
8.minEvictableIdleTimeMillis :连接池中连接,在时间段内一直空闲, 被逐出连接池的时间
9.removeAbandonedTimeout :超过时间限制,回收没有用(废弃)的连接(默认为 300 秒,调整为 180)
10.removeAbandoned :超过 removeAbandonedTimeout 时间后,是否进行没用连接(废弃)的回收(默认为 false,调整为 true)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值