6.4. 使用 OSGi JDBC 服务
				Enterprise R6 规范的第 125 章在 org.osgi.service.jdbc 软件包中定义一个接口。这是OSOS 如何处理数据源:
			
				如前文所述,普通的 java.sql.Connection 连接可以直接从 java.sql.Driver 获取。
			
Generic org.osgi.service.jdbc.DataSourceFactory
					org.osgi.service.jdbc.DataSourceFactory 最简单的实施是 org.ops4j.pax.jdbc.impl.DriverDataSourceFactory by mvn:org.ops4j.pax.pax.jdbc/pax-jdbc/1.3.0 bundle。它会跟踪包含标准 Java™ ServiceLoader 实用程序的 /META-INF/services/java.sql.Driver 描述符的捆绑包。如果您安装任何标准 JDBC 驱动程序,pax-jdbc 捆绑包注册一个可用于(而非直接)的 DataSourceFactory,以便通过 java.sql.Driver.connect() 调用来获取连接。
				
				使用以上命令时,javax.sql.DataSource 服务仍然没有注册,但您更接近一步。以上中介 org.osgi.service.jdbc.DataSourceFactory 服务可用于获取:
			
- 
						java.sql.Driver
- 
						javax.sql.DataSource通过传递属性:url、用户和密码createDataSource()方法。
				您无法从普通的 org.osgi.jdbc.DataSource 获取 ,由一个非数据库特定的 javax.sql.ConnectionPoolDataSource 或 javax.sql.XADataSource Factorypax-jdbc 捆绑包创建。
			
					mvn:org.postgresql/postgresql/42.2.5 捆绑包可以正确地实现 OSGi JDBC 规格,并注册一个 org.osgi.service.jdbc.DataSourceFactory 实例,并附带所有实施的方法,包括创建 XA 和 ConnectionPool 数据源。
				
专用、特定于数据库的 org.osgi.service.jdbc.DataSource factory 实施
还有其他捆绑包,比如以下所示:
- 
						mvn:org.ops4j.pax.jdbc/pax-jdbc-mysql/1.3.0
- 
						mvn:org.ops4j.pax.jdbc/pax-jdbc-db2/1.3.0
- …
				这些捆绑包注册特定于数据库的 org.osgi.service.jdbc.DataSource factory 服务,这些服务可以返回所有 工厂,包括 javax.sql.ConnectionPoolDataSource 和 javax.sql.XADataSource。例如:
			
6.4.1. PAX- JDBC 配置服务
					使用 pax-jdbc (或 pax-jdbc-mysql,pax-jdbc-oracle, …)捆绑包时,您可以具有 org.osgi.service.jdbc.DataSourceFactory 服务,注册可用于获取给定数据库的数据源(请参阅 第 6.2.1 节 “特定于数据库及通用数据源”)。但是您还没有实际数据源。
				
					mvn:org.ops4j.pax.jdbc/pax-jdbc-config/1.3.0 捆绑包提供了一个可执行以下操作的托管服务工厂:
				
- 跟踪 - org.osgi.service.jdbc.DataSourcefactory OSGi 服务,以调用其方法:- public DataSource createDataSource(Properties props); public XADataSource createXADataSource(Properties props); public ConnectionPoolDataSource createConnectionPoolDataSource(Properties props); - public DataSource createDataSource(Properties props); public XADataSource createXADataSource(Properties props); public ConnectionPoolDataSource createConnectionPoolDataSource(Properties props);- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 
							跟踪 org.ops4j.datasourcefactory PID,以收集以上方法需要的属性。如果您使用 Configuration Admin 服务可用的任何方法创建 工厂配置,例如,创建一个${karaf.etc}/org.ops4j.datasource-mysql.cfg文件,您可以执行最后一步公开实际的数据库特定数据源。
以下是从全新的 Fuse 安装开始的详细 规范 步骤指南。
您可以明确安装捆绑包而不是功能,以精确显示需要哪些捆绑包。为方便起见,PAX JDBC 项目为几个数据库产品和配置方法提供了功能。
- 使用 - /META-INF/services/java.sql.Driver安装 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: 223- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 安装 OSGi JDBC 服务捆绑包和 - pax-jdbc-mysql捆绑包,该捆绑包注册 中介- org.osgi.service.jdbc.DataSourceFactory:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 安装 - pax-jdbc捆绑包和- pax-jdbc-config捆绑包,该捆绑包跟踪- org.osgi.service.jdbc.DataSourceFactory服务和- org.ops4j.datasourcefactory PIDs:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 创建 factory 配置 (假设 MySQL 服务器正在运行): - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 检查 - pax-jdbc-config是否处理配置到- javax.sql.DataSource服务:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
您现在有一个特定于数据库的(还没有池)数据源。您已经将其注入了需要的位置。例如,您可以使用 Karaf 命令来查询数据库:
在上例中,您可以看到 MySQL 警告。这不是一个问题。可能不提供任何属性(而不仅限于 OSGi JDBC 特定属性):
6.4.2. 处理的属性摘要
					管理 工厂 PID 配置的属性传递到相关的 org.osgi.service.jdbc.DataSource factory 实施。
				
通用
						org.ops4j.pax.jdbc.impl.DriverDataSourceFactory properties:
					
- 
							url
- 
							user
- 
							password
DB2
						org.ops4j.pax.jdbc.db2.impl.DB2DataSource factory 属性包含这些实施类的所有 bean 属性:
					
- 
							com.ibm.db2.jcc.DB2SimpleDataSource
- 
							com.ibm.db2.jcc.DB2ConnectionPoolDataSource
- 
							com.ibm.db2.jcc.DB2XADataSource
PostgreSQL
						Nnative org.postgresql.osgi.PGDataSource factory 属性包括 org.postgresql.PGProperty 中指定的所有属性。
					
HSQLDB
						org.ops4j.pax.jdbc.hsqldb.impl.HsqldbDataSourceFactory properties:
					
- 
							url
- 
							user
- 
							password
- 
							databaseName
- 所有 bean 属性 - 
									org.hsqldb.jdbc.JDBCDataSource
- 
									org.hsqldb.jdbc.pool.JDBCPooledDataSource
- 
									org.hsqldb.jdbc.pool.JDBCXADataSource
 
- 
									
SQL 服务器和 Sybase
						org.ops4j.pax.jdbc.jtds.impl.JTDSDataSource factory 属性包含 net.sourceforge.jtds.jdbcx.JtdsDataSource 的所有属性。
					
SQL Server
						org.ops4j.pax.jdbc.mssql.impl.MSSQLDataSource factory 属性:
					
- 
							url
- 
							user
- 
							password
- 
							databaseName
- 
							serverName
- 
							portNumber
- 所有 bean 属性 - 
									com.microsoft.sqlserver.jdbc.SQLServerDataSource
- 
									com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource
- 
									com.microsoft.sqlserver.jdbc.SQLServerXADataSource
 
- 
									
MySQL
						org.ops4j.pax.jdbc.mysql.impl.MysqlDataSourceFactory properties:
					
- 
							url
- 
							user
- 
							password
- 
							databaseName
- 
							serverName
- 
							portNumber
- 所有 bean 属性 - 
									com.mysql.jdbc.jdbc2.optional.MysqlDataSource
- 
									com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
- 
									com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
 
- 
									
Oracle
						org.ops4j.pax.jdbc.oracle.impl.OracleDataSourceFactory properties:
					
- 
							url
- 
							databaseName
- 
							serverName
- 
							user
- 
							password
- 所有 bean 属性 - 
									oracle.jdbc.pool.OracleDataSource
- 
									oracle.jdbc.pool.OracleConnectionPoolDataSource
- 
									oracle.jdbc.xa.client.OracleXADataSource
 
- 
									
SQLite
						org.ops4j.pax.jdbc.sqlite.impl.SqliteDataSourceFactory properties:
					
- 
							url
- 
							databaseName
- 
							org.sqlite.SQLiteDataSource的所有 bean 属性
6.4.3. pax-jdb-config 捆绑包如何处理属性
					pax-jdbc-config 捆绑包处理前缀为 jdbc. 的属性。所有这些属性将删除此前缀,其余名称将随即传递。
				
下面是一下例子,从全新的 Fuse 安装开始:
					pax-jdbc-config 捆绑包需要以下属性:
				
- 
							osgi.jdbc.driver.name
- 
							dataSourceName
- 
							dataSourceType
					定位并调用相关的 org.osgi.service.jdbc.DataSourceFactory 方法。带有 jdbc. 前缀的属性传递(在删除前缀后),例如 org.osgi.service.jdbc.DataSource factory.createDataSource(properties)。但是,这些属性会在没有删除前缀的情况下添加,例如 javax.sql.DataSource OSGi 服务的属性。