Java 学习之路 之 使用连接池管理连接(五十八)

数据库连接的建立及关闭是极耗费系统资源的操作,在多层结构的应用环境中,这种资源的耗费对系统性能影响尤为明显。通过前面介绍的方式(通过 DriverManager 获取连接)获得的数据库连接,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接。频繁地打开、关闭连接将造成系统性能低下。

数据库连接池的解决方案是:当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库连接时,无须重新打开连接,而是从连接池中取出已有的连接使用,使用完后不再关闭数据库连接,而是直接将连接归还给连接池。通过使用连接池.将大大提高程序的运行效率。

对于共享资源的情况,有一个通用的设计模式:资源池(Resource Pool),用于解决资源的频繁请求、释放所造成的性能下降。为了解决数据库连接的频繁请求、释放。JDBC 2.0 规范引入了数据库连接池技术。数据库连接池是 Connection 对象的工厂。数据库连接池的常用参数如下:

数据库的初始连接数;

连接池的最大连接数;

连接池的最小连接数;

连接池每次增加的容量。

JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由商用服务器(WebLoginc、WebSphere)等提供实现,也有一些开源组织提供实现(如 DBCP 和 C3PO 等)。

DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,但习惯上我们也经常把 DataSource 称为连接池。

不介绍任何商用服务器的数据源实现,主要介绍 DBCP 和 C3P0 两种开源的数据源实现。

1,DBCP 数据源

DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:common-pool。如果需要使用该连接池实现,则应在系统中增加如下两个 jar 文件。

commons-dbcp.jar:连接池的实现。

commons-pool.jar:连接池实现的依赖库。

登录 http://commons.apache.org/ 站点即可下载 commons-pool.zip 和 commons-dbcp.zip 两个压缩文件,解压缩这两个文件即可得到上面提到的两个 JAR 文件。为了在程序用这两个 JAR 文件应该把它们添加到系统的类加裁路径中(比如添加到 CLASSPATH 环境变量中)。

Tomcat 的连接池正是采用该连接池实现的。数据库连接池既可以与应用服务器整合使用,也可以由应用程序独立使用。下面的代码片段示范了使用 DBCP 来获得数据库连接的方式。

// 创建数据源对象
BasicDataSource ds = new BasicDataSource();
// 设置连接池所需的驱动
ds.setDriverClassName("com.mysql.jdbc.Driver");
// 设置连接数据库的 URL
ds.setUrl("jdbc:mysql://localhost:3306/javaee");
// 设置连接数据库的用户名
ds.setUsername("root");
// 设置连接数据库的密码
ds.setPassword("pass");
// 设置连接池的初始连接数
ds.setInitialSize(5);
// 设置连接池最多可有多少个活动连接数
ds.setMaxActive(20);
// 设置连接池中至少有 2 个空闲的连接
ds.setMinIdle(2)

数据源和数据库连接不同,数据源无须创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。也就是说,对于一个应用,上面代码只要执行一次即可。建议把上面程序中的 ds 设置成 static 战员变量,并且在应用开始时立即初始化数据源对象,程序中所有需要获取数据库连接的地方直接访问该 ds 对象,并获取数据库连接即可。通过 DataSource 获取数据库连接的代码示例如下:

// 通过数据源获取数据库连接
Connection conn = ds.getConnection();

当数据库访问结束后,程序还是像以前一样关闭数据库连接,如下代码所示:

// 释放数据库连接
conn.close();

2,C3P0 数据源

相比之下,C3P0 数据源性能更胜一筹,Hibernate 就推荐使用该连接池。C3P0 连接池不仅可以自动清理不再使用的 Connection,还可以自动清理 Statement 和 ResultSet。C3P0 连接池需要版本为 1.3 以上的 JRE,推荐使用 1.4 以上的 JRE。如果需要使用 C3P0 连接池,则应在系统中增加如下 JAR 文件。

c3p0-0.9.1.2.jar:C3P0 连接池的实现。

登录 http://sourceforge.net/projects/c3p0/ 站点即可下载 C3P0 数据源的最新版本,下载后得到一个 c3p0-0.9.1.2.bin.zip文件(版本号可能有区别),解压缩该文件,即可得到上面提到的 JAR 文件。

下面代码通过 C3P0 连接池获得数据库连接。

// 创建连接池实例
ComboPooledDataSource ds = new ComboPooledDataSource();
// 设置连接词连接数据库所需的驱动
ds.setDriverClass("com.mysql.jdbc.Driver");
// 设置连接数据库的 URL
ds.setJdbcUrl("jdbc:mysql://localhost:3306/javaee");
// 设置连接数据库的用户名
ds.setUser("root");
// 设置连接数据库的密码
ds.setPassword("3214");
// 设置连接池的最大连接数
ds.setMaxPoolSize(40);
// 设置连接池的最小连接数
ds.setMinPoolSize(2);
// 设置连接池的初始连接数
ds.setInitialPoolSize(10);
// 设置连接池的缓存 Statement 的最大数
ds.setMaxStatements(180);

在程序中创建 C3P0 连接池的方法与前面介绍的创建 DBCP 连接池的方法基本类似,此处不再解释。一旦获取了 C3P0 连接池之后,程序同样可以通过如下代码来获取数据库连接。

// 获取数据库连接
Connection conn = ds.getConnection();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值