数据库连接的建立及关闭极耗系统资源的操作,在多层结果的应用环境中,这种资源的耗费对系统性能影响尤为明显。
通过DriverManager获得的数据库连接,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接。频繁的打开、关闭连接将造成系统性能低下。
数据库连接池的解决方案是:当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接使用,使用完后,不再关闭数据库连接,而是直接将连接归还给连接池。通过使用连接池,经大大提供程序运行效率。
DBCP数据源是Apache软件基金组织下的开源连接池实现。Tomcat的连接池正是采用该连接池来实现的。数据库连接池可以与应用服务器整合使用,也可由应用程序独立使用。
package com.sun.demo; import java.sql.Connection; import org.apache.commons.dbcp.BasicDataSource; public class Test04 { /** * 此程序使用DBCP数据源取得数据库连接。 * * 主流数据库连接池之一(DBCP、c3p0、proxool),单独使用DBCP需要使用commons-dbpc.jar、 * commons-collections.jar、commons-pool.jar三个包 * commons-dbpc.jar:连接池的实现 * commons-pool.jar:连接池实现的依赖库 */ public static void main(String[] args) throws Exception { // 创建数据源对象 BasicDataSource ds = new BasicDataSource(); // 设置连接池所需的驱动 ds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); // 设置连接数据库的url ds.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:jssbook"); // 设置连接数据库的用户名 ds.setUsername("scott"); // 设置数据库的密码 ds.setPassword("tiger"); // 设置连接池的初始连接数 ds.setInitialSize(5); // 设置连接池最多可有有多少个活动连接数 ds.setMaxActive(20); // 设置连接池中最少有2个空闲的连接 ds.setMinIdle(2); // 通过数据源获取连接 Connection con = ds.getConnection(); con.close(); } }
数据源和数据库连接不同,数据源无须创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。建议吧上面的程序中ds设置成static成员变量,并且在应用开始时立即初始化数据源对象,程序中所有需要获取数据库连接的地方直接访问该ds对象,并获取数据库连接即可,当数据库访问结束后,程序还是像以前一样关闭数据库连接。