Java使用独立数据库连接池(DBCP为例)
目前,绝大多数的软件系统都会使用数据库,而在软件构建起来之后,访问数据库又成为软件系统性能的短板(I/O 操作)。一般来说一次访问数据库就需要一个数据库连接。而每次创建数据库连接都需要访问,分配空闲资源,占用资源,释放资源,结束访问。非常的耗费时间和空间。
于是数据连接池技术便产生了,其原理就是在数据请求方和数据库之间建立一个数据库连接管理层。在系统启动的时候就分配一定数量的连接,并维护这些连接,保持最低数量的连接数。同时为了保护数据库和系统,设置一个最大连接数,缓解数据库的访问压力。
这样在每次数据请求方需要连接时,管理器便分配一个连接给数据请求方,数据请求方使用完连接后,将连接归还给管理器,这样就尽可能的减少不必要的数据库连接消耗。
在 Java 的数据库服务 JDBC 中并没有提供一个实际 ConnectionPool 实现,但是留出了接口以支持第三方服务提供商,我觉得其中最重要的接口是 DataSource。
实际上 Java 访问数据库的方式主要有四种:
一、使用 DriverMananger 来直接编程实现,这种是最基本的方式。
DriverMananger 实现数据库连接的关键步骤为:
1>Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();
2>Connection conn = null;
3>conn = DriverManager.getConnection(url, "name", "password");
二、使用服务器配置文件来实现连接池。
一些服务器提供了自己的数据库连接池服务,例如 Tomcat 服务器就提供了由 commons-DBCP 支持的数据池连接服务,只需要在 context.xml 中填写相应的数值就可以了。
三、配置文件配置 datasource
DataSource 是在 JavaAPI 中提供的一个接口,第三方服务在实现了 DataSource 之后,例如 DBCP 的 BasicDataSource,为了提高数据库连接池的可配置性,便利用 IOC 模式(控制反转),将实际的 Bean 与配置数据分开,配置数据放在配置文件中(一般使用 XML)。来实现对多个数据库的控制。
而在 DataSource 对象实例化之后,通过 DataSource.getConnection() 就可以得到连接了。
四、通过配置 jdbc-odbc 连接桥
听说过,没有使用过,没有发言权。
在这里使用 Apache 提供的 commons-DBCP 来实现一个独立的简单的数据库连接池。
首先需要三个工具包:commons-pool.jar,commons-collection.jar,commons-DBCP.jar。
关键实现代码段见下:
于是数据连接池技术便产生了,其原理就是在数据请求方和数据库之间建立一个数据库连接管理层。在系统启动的时候就分配一定数量的连接,并维护这些连接,保持最低数量的连接数。同时为了保护数据库和系统,设置一个最大连接数,缓解数据库的访问压力。
这样在每次数据请求方需要连接时,管理器便分配一个连接给数据请求方,数据请求方使用完连接后,将连接归还给管理器,这样就尽可能的减少不必要的数据库连接消耗。
在 Java 的数据库服务 JDBC 中并没有提供一个实际 ConnectionPool 实现,但是留出了接口以支持第三方服务提供商,我觉得其中最重要的接口是 DataSource。
实际上 Java 访问数据库的方式主要有四种:
一、使用 DriverMananger 来直接编程实现,这种是最基本的方式。
DriverMananger 实现数据库连接的关键步骤为:
1>Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();
2>Connection conn = null;
3>conn = DriverManager.getConnection(url, "name", "password");
二、使用服务器配置文件来实现连接池。
一些服务器提供了自己的数据库连接池服务,例如 Tomcat 服务器就提供了由 commons-DBCP 支持的数据池连接服务,只需要在 context.xml 中填写相应的数值就可以了。
三、配置文件配置 datasource
DataSource 是在 JavaAPI 中提供的一个接口,第三方服务在实现了 DataSource 之后,例如 DBCP 的 BasicDataSource,为了提高数据库连接池的可配置性,便利用 IOC 模式(控制反转),将实际的 Bean 与配置数据分开,配置数据放在配置文件中(一般使用 XML)。来实现对多个数据库的控制。
而在 DataSource 对象实例化之后,通过 DataSource.getConnection() 就可以得到连接了。
四、通过配置 jdbc-odbc 连接桥
听说过,没有使用过,没有发言权。
在这里使用 Apache 提供的 commons-DBCP 来实现一个独立的简单的数据库连接池。
首先需要三个工具包:commons-pool.jar,commons-collection.jar,commons-DBCP.jar。
关键实现代码段见下:
- // 持有一个静态的数据库连接池对象
- private static DataSource DS;
- // 使用 DBCP 提供的 BasicDataSource 实现 DataSource 接口
- public static void initDataSource(String connectURI, String username,
- String password, String driverClass, int initialSize,
- int maxActive, int maxIdle, int maxWait) {
- BasicDataSource ds = new BasicDataSource();
- ds.setDriverClassName(driverClass);
- ds.setUsername(username);
- ds.setPassword(password);
- ds.setUrl(connectURI);
- ds.setInitialSize(initialSize);
- ds.setMaxActive(maxActive);
- ds.setMaxIdle(maxIdle);
- ds.setMaxWait(maxWait);
- DS = ds;
- }
- // 获得一个数据库连接
- public Connection getConnection() {
- Connection con = null;
- if (DS != null) {
- try {
- con = DS.getConnection();
- } catch (Exception e) {
- System.out.println(e.getMessage()); }
- // 将数据库连接的事物设置为不默认为自动 Commit
- try {
- con.setAutoCommit(false);
- } catch (SQLException e) {
- System.out.println(e.getMessage()); }
- return con;
- }
- // 回收数据库连接时,直接使用 con.close() 即可
- return con;
- }
- // 回收数据库连接
- protected static void shutdownDataSource() throws SQLException {
- BasicDataSource bds = (BasicDataSource) DS;
- bds.close();
- }
上面的代码都是从实际使用的代码抽取出来的,希望可以帮助大家。
目前,OpenSource 中提供了很多的数据库连接池技术,使用的流程和模式,都与上面的代码大同小异。同时最新发布的 BoneCP 我还从来没有感受过,希望有朋友与我分享一下使用经验。