javaweb数据库连接池如何实现C3P0

再练习代码之前,我们先要了解一下关于数据库连接池的知识点

数据库连接池简介:

        数据库连接池的基本思想就是为数据库连接建立一个“ 缓冲池 。预先在缓冲池中放入一定数量的连接,当需要建立 数据库连接时,只需从“ 缓冲池 中取出一个,使用完毕之后再放回去。

数据库连接池的优点:

1. 资源重用
        由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面 也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程线程的数量)。
2. 更快的系统响应速度
        数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统 整体响应时间。
3. 新的资源分配手段
        对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数
据库连接池技术。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。
4. 统一的连接管理,避免数据库连接泄漏 在较为完备的数据库连接池实现中,可根据预先的连占用超时设定,强制收回被占用连接。从而避免了常规数据库 连接操作中可能出现的资源泄漏。一个最小化的数据库连接池实现 没使用连接池时:在访问数据库的时候,要创建数据库连接,使用完成后还要进行销毁;而使用数据库连接池时: 当Tomcat 启动的时候,会事先创建指定数量的连接,当请求访问数据的时候,可直接从连接池中获取连接。使用 完毕后再放回去供其他操作使用。因此使用数据库连接池还可以提高性能。

常用的数据库连接池

1.DBCP 数据库连接池 ( 稳定性比较好 )
        DBCP是 Apache 软件基金组织下的开源连接池实现,使用 DBCP 数据源,应用程序应在系统中增加两个 jar 文件:
Commons-dbcp.jar: 连接池的实现
Commons-pool.jar: 连接池实现的依赖库
Tomcat 的连接池正是采用该连接池来实现的。给数据库连接既可以与应用服务器整合使用,也可由应用程序独立
使用。
2.C3Po 数据库连接池(性能比较高)
        C3PO连接池是一个优秀的连接池,推荐使用。 C3PO 实现了 JDBC3.0 规范的部分功能,因而性能更突出。
        C3P0是一个开源的 JDBC连接池,它实现了数据源和 JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用它的开源项目有Hibernate、Spring等。
        下面将详细介绍C3P0的实现:
步骤如下:
// 1.导入jar包 :lib/c3p0-0.9.2-pre1.jar mchange-commons-0.2.jar
// 2.导入配置文件 c3p0-config.xml 存放在src目录下
// 3.创建数据库连接池对象 接口 DataSource
DataSource dataSource = new ComboPooledDataSource();
// 4.DataSource 对象是获取连接对象
Connection connection = dataSource.getConnection();
System.out.println(connection);

C3P0实现

c3p0-config.xml
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
其中有获得连接数、获得链接的超时时间等的设置,可自行修改配置.
#驱动全限定类名
driverClassName=com.mysql.jdbc.Driver
#数据库连接地址
url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8
#数据库用户名
username=root
#数据库密码
password=123
#连接池建立时创建的连接的数量
initialSize=2
#连接池同一时间内最多能够分配的活动连接的数量
maxActive=15
#在其他连接没有被释放的情况下,连接池中最多能够保留的闲置连接
maxIdle=2
#在没有其他连接被创建的情况下,连接池中最少可以保留的闲置连接
minIdle=1
#当遇到请求,而连接池中没有连接可以被分配,连接池最大等待时间,超过这个时间将会抛出一个异常。为-1时,将会无限期等待。
maxWait=30000
步骤:
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
/*
DBCP 数据库连接池技术 :
1 、导入 jar
:commons-dbcp.jar commons-pool.jar
2 、配置文件
需要复制粘贴到 src 目录下
3 、加载配置文件
4 、创建数据库连接池对象
5 、获取连接对象
*/
public class Test1 {
public static void main(String[] args) throws Exception {
// 3 、加载配置文件
Properties pro = new Properties();
InputStream is = Test1.class.getClassLoader().getResourceAsStream("dbcp.properties");
pro.load(is);
// 4 、创建数据库连接池对象
DataSource dataSource = BasicDataSourceFactory.createDataSource(pro);
// 5 、获取连接对象
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement("select * from user2");
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()){
String name = resultSet.getString("username");
System.out.println(name);
}
}
}
  • 29
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值