6.7. 使用 JDBC 连接池
本节介绍了使用 JDBC 连接池,然后演示如何使用这些连接池模块:
本章介绍了数据源管理内部的详细信息。虽然提供了关于 DBCP2 连接池功能的信息,但请记住,此连接池提供正确的 JTA 编码功能,但不提供 XA 恢复功能。
为确保 XA 恢复 已就位,请使用 pax-jdbc-pool-transx 或 pax-jdbc-pool-narayana 连接池模块。
6.7.1. 使用 JDBC 连接池简介 复制链接链接已复制到粘贴板!
前面的示例演示了如何注册特定于数据库的数据源 工厂。由于 数据源 本身是连接的工厂,org.osgi.service.jdbc.DataSourceFactory 可能会被视为元工厂,它应该能够生成三种类型的数据源,以及作为 bonus,一个 java.sql.Driver:
-
javax.sql.DataSource -
javax.sql.ConnectionPoolDataSource -
javax.sql.XADataSource
例如,pax-jdbc-mysql 注册一个 org.ops4j.pax.jdbc.mysql.impl.MysqlDataSourceFactory,它会产生:
-
javax.sql.DataSourcecom.mysql.jdbc.jdbc2.optional.MysqlDataSource -
javax.sql.ConnectionPoolDataSourcecom.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource -
javax.sql.XADataSourcecom.mysql.jdbc.jdbc2.optional.MysqlXADataSource -
java.sql.Drivercom.mysql.jdbc.Driver
PostgreSQL 驱动程序本身实施 OSGi JDBC 服务并生成:
-
javax.sql.DataSourceorg.postgresql.jdbc2.optional.PoolingDataSource(如果指定了池相关的属性)或org.postgresql.jdbc2.optional.SimpleDataSource -
javax.sql.ConnectionPoolDataSourceorg.postgresql.jdbc2.optional.ConnectionPool -
javax.sql.XADataSourceorg.postgresql.xa.PGXADataSource -
java.sql.Driverorg.postgresql.Driver
如 规范数据源示例 所示,任何池、通用 数据源都要在 JTA 环境中工作,则需要一个 数据库特定 数据源来实际获取(XA)连接。
我们已有后者,我们需要实际的、通用、可靠的连接池。
规范数据源示例 演示了如何配置特定数据库数据源的通用池。pax-jdbc-pool indices 捆绑包与上述 org.osgi.service.jdbc.DataSourceFactory 服务平稳工作。
正如 OSGI Enterprise R6 JDBC 规范提供了 org.osgi.service.jdbc.DataSourceFactory 标准接口,pax-jdbc-pool-common 提供 专有 org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory 接口:
public interface PooledDataSourceFactory {
javax.sql.DataSource create(org.osgi.service.jdbc.DataSourceFactory dsf, Properties config)
}
public interface PooledDataSourceFactory {
javax.sql.DataSource create(org.osgi.service.jdbc.DataSourceFactory dsf, Properties config)
}
这个界面完全符合之前介绍的重要备注,值得重复:
即使应用使用 XA 事务和/或连接池,应用与 javax.sql.DataSource 交互,而不是另外两个 JDBC 数据源接口。
这个界面只是从特定于数据库且非池数据中创建池数据源。或者更精确地,它是一个 数据源工厂 (meta factory),它将特定于数据库数据源的工厂转换为池数据源的工厂。
没有这样可防止应用使用 org.osgi.service.jdbc.DataSource 对象为 已经为 javax.sql.DataSource 对象配置池,该服务javax.sql.DataSource 对象返回池。
下表显示了哪些捆绑包注册池数据源工厂。在表格中,o.o.p.j.p 的实例代表 org.ops4j.pax.jdbc.pool。
| 捆绑包(Bundle) | PooledDataSourceFactory | 池密钥 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
以上捆绑包只安装数据源,而不是数据源本身。应用需要调用 javax.sql.DataSource create (org.osgi.service.jdbc.DataSourceFactory dsf, Properties config) 方法的内容。
6.7.2. 使用 dbcp2 连接池模块 复制链接链接已复制到粘贴板!
有关通用数据源的部分提供了 如何使用和配置 Apache Commons DBCP 模块 的示例。本节演示了如何在 Fuse OSGi 环境中执行此操作。
考虑 第 6.4.1 节 “PAX- JDBC 配置服务” 捆绑包。除了跟踪以下内容外:
-
org.osgi.service.jdbc.DataSourceFactoryservices -
org.ops4j.datasourcefactory PIDs
该捆绑包还会跟踪 org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory 实例,它们由 pax-jdbc-pool reading 捆绑包之一注册。
如果 工厂配置包含 pool 属性,则 pax-jdbc-config 捆绑包注册的最终数据源是我们的数据库特定数据,但如果 pool=dbcp2则嵌套在以下之一:
-
org.apache.commons.dbcp2.PoolingDataSource -
org.apache.commons.dbcp2.managed.ManagedDataSource
这与 通用数据源示例 一致。除了 pool 属性和布尔值 xa 属性外,它选择非xa 或 xa 数据源,org.ops4j.datasource factory PID 可能会包含 前缀 属性:
-
pool.* -
factory.*
其中,每个属性都使用哪个 pax-jdbc-pool suppress 捆绑包被使用。对于 DBCP2,它是:
-
pool mdadm: bean 属性的org.apache.commons.pool2.impl.GenericObjectPoolConfig(xa 和非 xa 场景) -
factoryadtrust: bean 属性是org.apache.commons.dbcp2.managed.PoolableManagedConnectionFactory(xa)或org.apache.commons.dbcp2.PoolableConnectionFactory(non-xa)
以下是一个现实示例(除了使用 SSL=false)配置 DBCP2 池(org.ops4j.datasource-mysql factory PID),它使用 jdbc.-prefixed 属性的方便语法:
在上面的配置中,pool 和 xa 键是 提示 (服务过滤器属性)来选择一个注册的 org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory 服务。对于 DBCP2,这是:
为了完整性,以下是一个完整的示例,其连接池配置添加到 上例中。同样,这假设您是从全新的 Fuse 安装开始。
安装 JDBC 驱动程序:
karaf@root()> install -s mvn:mysql/mysql-connector-java/5.1.34 Bundle ID: 223
karaf@root()> install -s mvn:mysql/mysql-connector-java/5.1.34 Bundle ID: 223Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安装
jdbc、pax-jdbc-mysql和pax-jdbc-pool-dbcp2功能:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 工厂配置 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
pax-jdbc-config是否将配置处理到javax.sql.DataSource服务中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用数据源:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.7.3. 使用 narayana 连接池模块 复制链接链接已复制到粘贴板!
pax-jdbc-pool-narayna 模块几乎执行所有操作为 pax-jdbc-pool-dbcp2。它为 XA 和非 XA 场景安装 DBCP2 特定的 org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory。唯一 的区别在于,XA 场景中有一个额外的集成点。org.jboss.tm.XAResourceRecovery OSGi 服务被注册为由 com.arjuna.ats.arjuna.recovery.RecoveryManager (这是 Narayana 事务管理器的一部分)。
6.7.4. 使用 transx 连接池模块 复制链接链接已复制到粘贴板!
pax-jdbc-pool-transx 捆绑包基础,它对 pax-transx-jdbc 捆绑包上的 org.ops4j.pax.jdbc.pool.common.PooledDataSourceFactory 服务实施。pax-transx-jdbc 捆绑包使用 org.ops4j.pax.transx.jdbc.ManagedDataSourceBuilder 工具创建 javax.sql.DataSource 池。这是一个 JCA (Java™ Connector Architecture)解决方案,稍后 进行介绍。