http://www.blogjava.net/Unmi/archive/2008/01/16/175683.html
我在 Websphere Application Server (WAS) 下配置 JDBC 提供程序时,选择了 Oracle JDBC Driver 确定之后,看到最后一个选项是:oracle.jdbc.pool.OracleConnectionPoolDataSource。
顾名思义,这是一个 DataSource 实现为,就像 DBCP 的 BasicDataSource 一样。那么能不能也像 BasicDataSource 那样,通过 new BasicDataSource(),然后设置各个必须的属性得到一个数据源 DataSource 呢?这个 OracleConnectionPoolDataSource 又是在哪个包里呢?
用 Eclipse 的 Jar Search 插件一查,原来它就是我们熟知的 classes111.jar 里,当然,在 $ORACLE_HOME/jdbc/lib 下的 classes12.jar、classes12.zip、classes12dms.jar、classes111.zip, nls_charset11.jar、nls_charset11.zip、nls_charset12.jar、nls_charset12.zip、 ojdbc14.jar、ojdbc14_g.jar。它们都是可用的 Oracle 驱动包,只是一直都未搞明它们之间有什么或大或小的差异。
先看一段 DataSource 的创建及测试代码
view sourceprint
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import oracle.jdbc.pool.OracleConnectionPoolDataSource;
**
11.
* 创建及测试 OracleDataSource
12.
* @author Unmi
13.
*/
14.public class OracleDataSourceCreator {
15.
16.
/**
17.
* 测试代码
18.
* @param args
19.
* @throws SQLException
20.
*/
21.
public static void main(String[] args) throws SQLException {
22.
DataSource ds = createDataSource();
23.
Connection conn = ds.getConnection();
24.
25.
//打印出 conn 的实现类名
26.
System.out.println("Connection 实现类是:"+conn);
27.
28.
//测试查询记录
29.
Statement stmt = conn.createStatement();
30.
ResultSet rs = stmt.executeQuery("select * from dual");
31.
if(rs.next()){
32.
System.out.println(rs.getString(1));
33.
}
34.
35.
//以下测试是否使用的是连接池,每次关闭连接前用 netstat -na|findstr 38.2 查看连接
36.
conn.close();
37.
conn = ds.getConnection();
38.
conn.close();
39.
conn = ds.getConnection();
40.
conn.close();
41.
}
42.
43.
/**
44.
* 创建一个 DataSource
45.
* @throws SQLException
46.
*/
47.
public static DataSource createDataSource() throws SQLException
48.
{
49.
OracleConnectionPoolDataSource ocps = new OracleConnectionPoolDataSource();
50.
ocps.setURL("jdbc:oracle:thin:@10.128.38.2:1521:sr3");
51.
ocps.setUser("qatest");
52.
ocps.setPassword("qatest");
53.
return ocps;
54.
}
55.}
测试过程及结果:运行上面的代码,确实能获得数据库表中的记录,并且 Connection 的实现类是 oracle.jdbc.driver.OracleConnection。我们可以通过设定断点在 main() 方法的第一个 conn.close() 代码行,进行单步调试。
这时我们在命令行下执行 netstat -na|findstr 38.2 查看到 38.2 的连接,发现该连接是 ESTABLISHED
执行 conn.close() 方法,再用上面的 netstat 命令,看到上一个连接是 TIME_WAIT
再执行 conn = ds.getConnection(); netstat 看到又新启了一个连接 ESTABLISHED
再执行 conn.close(),上面连接变为 TIME_WAIT
注:短时间内,根据目标地址加端口号可唯一确定是否同一连接
由此我们可以断定,我们拿到的数据库的连接并没有被池化,有点是为 OracleConnectionPoolDataSource 所迷惑了。每次取的都是新的连接,因为在 conn.close() 是实际关闭了物理连接,连接无法被重用。
那么怎么才能让连接池化可重复利用呢?我们要引入 OracleConnectionCacheImpl,也是在 classes111.jar 中有,和 OracleConnectionPoolDataSource 一样都实现了 DataSource 接口。
把上面的 createDataSource() 方法实现替换如下:
view sourceprint?01./**
02.
* 创建一个 DataSource,这个才是最终可用参考版
03.
* 外加 OracleConnectionCacheImpl 对 OracleConnectionPoolDataSource 包装
04.
* @throws SQLException
05.
*/
06.public static DataSource createDataSource() throws SQLException
07.{
08.
OracleConnectionPoolDataSource ocps = new OracleConnectionPoolDataSource();
09.
ocps.setURL("jdbc:oracle:thin:@10.128.38.2:1521:sr3");
10.
ocps.setUser("qatest");
11.
ocps.setPassword("qatest");
12.
13.
OracleConnectionCacheImpl occi = new OracleConnectionCacheImpl();
14.
occi.setConnectionPoolDataSource(ocps);
15.
return occi;
16.}
重新对我们改过的代码作相同的测试,我们发现每次 conn.close() 之后,原来的连接状态仍然是 ESTABLISHED,下一次用 ds.getConnection() 取到的仍然是原来的连接,这样就达到了连接池化的目的。还有,一个实际生产环境用的连接池都会根据实际设置连接的最小及最大数量以及清除策略,是我们看到 OracleConnectionPoolDataSource 没有相应的设置项,这也没问题,还得靠 OracleConnectionCacheImpl 来设置 minLimit 和 maxLimit 属性。这里我们不显式的使用 OracleConnectionPoolDataSource,并且加上连接的最小最大连接量的设定,后的创建连接池的方法实现如下:
view sourceprint?01./**
02.
* 创建一个 DataSource
03.
* 直接使用 OracleConnectionCacheImpl
04.
* @throws SQLException
05.
*/
06.public static DataSource createDataSource() throws SQLException
07.{
08.
OracleConnectionCacheImpl occi = new OracleConnectionCacheImpl();
09.
occi.setURL("jdbc:oracle:thin:@10.128.38.2:1521:sr3");
10.
occi.setUser("qatest");
11.
occi.setPassword("qatest");
12.
13.
occi.setMinLimit(2); //最小连接数
14.
occi.setMaxLimit(10); //最大连接数
15.
return occi;
16.}
实际上 OracleConnectionCacheImpl 的 ConnectionPoolDataSource 还是 OracleConnectionPoolDataSource。浏览 OracleConnectionCacheImpl 的方法你可以加上更多的属性控制。如果有需要特别是在容器中应用,你可以把创建的 DataSource 绑定到上下文中,方便应用随时引用。
后记,我们看到 Oracle 的驱动包都是 1M 多,还是有些内涵的,只是鲜见有人用它自带的连接池实现,一般是考虑通用性,就说其实数据库的移植性绝大多时候只是个漂亮的晃子,想想你做的哪个系统在两种类型数据库上有部署过。Oracle 自带我想应有它的优势,毕竟人家最了解自己了。
刚开始我用 OracleConnectionPoolDataSource 一时改变不了用 BasicDataSource 的惯性思维,总在想:如何设置数据库的驱动类啊?其实根本用不着,只缘它身在驱动包中。
还有一种不使用 OracleConnectionCacheImpl 也能用上连接池,那就是每次取连接不从 DataSource 中取,而是从一个 PooledConnection 实例中取,在第一段代码中改 main() 方法取连接的代码为如下:
view sourceprint?1.DataSource ds = createDataSource();
2.PooledConnection pooledConn = ((OracleConnectionPoolDataSource)ds).getPooledConnection();
3.Connection conn = pooledConn.getConnection();
不过,这种用户确实让人觉得有些别扭,本人不赞同这么使用,对于使用者来说规约不明。
另外,在 WAS 中配置 Oracle 连接池时,WAS 还会用到一个数据源帮助程序类名 com.ibm.websphere.rsadapter.OracleDataStoreHelper,这是在 $WAS_HOME/lib/rsaexternal.jar 包中的,尚不清楚有何用。
此文的目的是为 WAS 作自定义安全认证用户注册表作铺垫,意图是 WAS 控制台及上的应用以配置方式通过数据库作 Form/Basic 认证,需要写一个自定义的 JdbcRegistry 实现 UserRegistry 接口,希望通过以上方式配置数据库连接池获得连接。
分享到:
相关推荐
Oracle提供了几个关键接口和类来支持JDBC连接池和缓存: - `DataSource`: 这是一个标准的JDBC接口,作为创建数据库连接的工厂。Oracle提供了它的实现,如`OracleDataSource`,它可以配置为一个连接池数据源。 - `...
本实例提供了完美的Java JDBC连接池配置,适用于Oracle、MySQL和SQL Server等主流数据库,允许开发者轻松地在不同数据库之间切换方言。 首先,让我们了解什么是JDBC连接池。JDBC(Java Database Connectivity)是...
1. **选择连接池实现**:首先,我们需要选择一个合适的数据库连接池实现,如Apache的DBCP、C3P0、HikariCP或Tomcat JDBC连接池等。这些连接池库提供了管理和维护数据库连接的功能。 2. **配置连接池**:在应用的...
Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...
Oracle JDBC连接池技术提供了解决这一问题的有效方案,能够显著提高Web应用访问数据库的效率,缩短系统响应时间。本文将深入探讨Oracle JDBC连接池的工作机制、优势以及使用方法。 首先,JDBC(Java Database ...
总的来说,这个压缩包提供的内容可能是一个自定义的JDBC连接池实现,结合了`jdom.jar`库进行配置,并提供了一个测试示例。学习和理解这个实现可以帮助开发者更好地掌握数据库连接池的工作原理,以及如何在实际项目中...
在本文中,我们将详细介绍如何使用 Spring Boot 连接 Oracle 数据库,配置 JDBC 驱动程序,并实现数据库的基本操作。 Step 1: 添加依赖项 在 Spring Boot 项目中,需要在 `build.gradle` 文件中添加 Oracle JDBC ...
2. `ucp.jar`:Oracle Universal Connection Pool,是Oracle提供的连接池管理库,能够有效地管理和复用数据库连接,提高系统性能和资源利用率。 3. `ons.jar`:Oracle Notification Services,用于处理数据库的发布...
Oracle 提供了对 JDBC 的实现,使得开发者可以方便地在 Java 应用中访问和操作 Oracle 数据库。 Oracle JDBC 包含多个类和接口,其中最核心的是 `oracle.jdbc.driver.OracleDriver` 类,它是实现了 JDBC 驱动程序...
此外,通过`oracle.jdbc.pool.OracleDataSource` 类可以实现连接池功能,如使用Oracle的Universal Connection Pool (UCP),提高应用程序性能和资源利用率。 在开发过程中,还需要注意兼容性和性能优化,例如选择...
2. C3P0:这是一个开源的JDBC连接池,提供了比DBCP更高级的功能,如连接测试、空闲连接检测、自动扩展等。C3P0通过组合多个数据源来实现连接池,可以更好地控制并发和资源管理。 这些jar包的收集意味着开发者可以...
- **连接池**:通过集成第三方连接池库(如C3P0、Apache DBCP或HikariCP),实现数据库连接的复用,提高系统性能。 - **JNDI查找**:在应用服务器环境中,可以通过JNDI查找获取数据源,简化数据库连接配置。 在使用...
此类非常简单,免去了网上众多资料里所说的麻烦的tomcat配置,更强...不仅oracle,mysql,sqlserver2000都行,因为它依据的是你自己连接数据库的驱动。当然首先你要保证你拥有一个能连接自己数据库的对应驱动类。如下面以
HikariCP是一款高效、高性能的Java JDBC连接池,它被设计为替代传统连接池如C3P0和DBCP,以提供更快、更稳定的数据访问性能。在HikariCP v3.4.5这个版本中,我们可以深入探讨其在数据库连接管理、性能优化以及配置...
Apache Commons DBCP、C3P0、HikariCP等都是常见的Java连接池实现。 对于Tomcat,这是一个流行的开源Java Servlet容器,它支持集成连接池。在Tomcat中配置Oracle连接池,通常需要在`conf/server.xml`文件中的`...
### Oracle JDBC连接字符串详解 在Java开发环境中,与Oracle数据库进行交互时,通常会使用Java Database Connectivity (JDBC)技术来实现。本文将详细介绍如何通过JDBC连接Oracle数据库,并解释连接字符串及相关配置...
本资源提供了实现Java JDBC连接池所需的相关jar包,包括: 1. cp30.jar:这是一个C3P0连接池的库文件,它是一个开源的JDBC连接池,除了提供基本的连接池功能外,还具有异常检测、自动关闭空闲连接、支持JNDI绑定等...
Apache Commons DBCP(Database Connection Pool)是Apache软件基金会提供的另一个开源JDBC连接池实现。DBCP提供了基本的数据源和连接池实现,其主要特性包括: 1. **基于Jakarta Pool**:DBCP依赖于Jakarta Pool库...
UCP是Oracle提供的一个高级连接池,它增强了连接管理,提高了应用的可伸缩性和性能。UCP支持所有Oracle JDBC驱动,并提供了诸如健康检查、自动重连、负载均衡等功能。 在使用Oracle JDBC Jar包时,开发者需要确保...
在这个文件中,我们可以配置JDBC连接池,同时指定字符集,确保数据传输时的编码一致性。例如: ```xml ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- 其他配置项 --> ``` 2. **JDBC...