JDBC标准提供一组应用程序API来与不同供应商的数据库系统进行交互。

为了基于具体数据库和供应商特性之上的抽象,JDBC规范提供多样的类和服务接口,用于跟数据库的交互。

对于抽象的实现,是数据库专用的,并且由对应的驱动程序提供。

本规范定义了OSGI-aware JDBC驱动程序如何能够提供访问给他们的实现。应用程序可以依赖该机制来透明地访问驱动程序并且独立于驱动程序特定类。

另外,jdbc服务规范的提倡的机制帮助我们使用公共的OSGI最佳实践,避免类装载问题出现。

要点:

  • 注册-提供给JDBC驱动程序一种声明式注册的机制。
  • 查找-检查可用的数据库驱动程序并且提供对驱动器的访问。
  • 服务-使用服务模型来获得驱动器对象
  • 兼容-最小化工作量,这些工作量是为了兼容所有存在驱动程序所作的工作。

实体:

  • 关系型数据库管理系统
  • 数据库驱动程序
  • 数据源工厂-提供多种数据源用来访问数据库驱动程序。
  • 应用程序-用于访问数据库的程序

依赖:

在规范中提到的类和接口都来自:javax.sql,java.sql

这些包与版本无关,假设他们来自于运行环境

简介:

JDBC 数据库驱动程序是一个软件,他将JDBC规范与特定的数据库实现映射在一起。对于OSGI来说,JDBC驱动程序被以驱动程序bundle的形式交付,一个驱动程序bundle注册一个数据源工厂服务,当他激活的时候。服务属性被用来说明数据库驱动程序名称,版本等。数据源工厂服务提供方法来创建数据源,连接池数据源,XA数据源,或者驱动程序对象。这些对象随后被应用程序使用,来与数据库系统以标准的方式交互。

应用程序可以查询服务库来获得可用的数据源工厂服务,它可以选择特定的驱动程序,通过过滤服务属性的方式。这个服务是基于模块的,易于被依赖注入框架所使用,这些框架如:blueprint或者声明式服务。

数据库驱动程序

一个数据库驱动程序提供应用程序与特定数据库之间的链接,一个简单的OSGI框架能够同时包括一系列的数据库驱动程序。为了让自己为应用程序所用,数据库驱动程序必须注册一个数据源工厂服务,数据库驱动程序必须因此注册数据源工厂服务通过下面的服务属性:

  • OSGI_JDBC_DRIVER_CLASS-数据库驱动程序实现类的名字,这个属性是主键,用于寻找数据库驱动程序的数据源工厂,不要求有个同名的实际的类。
  • OSGI_JDBC_DRIVER_NAME-可选的数据库驱动名,该属性是一个信息而已
  • OSGI_JDBC_DRIVER_VERSION-数据库驱动程序版本,该版本不要求是一个OSGI的版本,他应当被视为一个不透明字符串,这个版本和实现类或者bundle的版本无关。

 

前面的属性是供应商特定的,是为了更深入的描述应用程序的数据库驱动。

每个数据源工厂服务必须与单一的数据库驱动程序关联,数据库驱动程序实现的bundle不是必须要做数据源工厂的注册的。任何bundle可以提供数据源工厂服务并且传播给驱动程序特定类。然而,JDBC驱动程序实现演变成了包括内置的OSGI支持,他们能够提供数据源工厂服务。这个情况明显预示着同一个驱动程序可以被多次注册成OSGI服务。

生命周期:

当数据源工厂服务的驱动程序bundle在活动状态时,或者当该驱动程序有一个lazy激活策略并且他正在启动状态时,一个数据源工厂服务应该被注册。

数据源工厂服务创建的对象发生了什么?以及这些对象创建的对象,都是在规范中没有定义的,数据库驱动程序没有任务去跟踪这些对象的生命周期。

包依赖:

一个数据库驱动程序必须导入javax.sql包,而java.sql包会被自动导入进来,因为它开始于java...呵呵。两个包都包含在JAVASE1.4之后的jre中。这些包的版本号和OSGI的版本号不一样的。bundles使用数据源工厂的话,必须确认他做了正确的导入,由于缺乏特定的元数据,部署者有责任确信这个东东。

应用程序:

选择数据源工厂服务:

应用程序可以查询OSGI服务库来获得可用的数据库驱动程序。可以得到一个数据源工厂服务的类表哦。

正常情况下,应用程序需要访问数据库对应的特定的驱动程序。服务属性可以被用来查找需要的数据库驱动程序。这个模型是支持良好的,被依赖注入框架,如blueprint等。然而,当然他也可以被用于基本的服务方法,下面的代码显示了一个Service Tracker能够使用一个ACME DB数据库驱动程序:

Filter filter = context.createFilter(
"(&(objectClass=" +
DataSourceFactory.class.getName() +
")(" +
DataSourceFactory.OSGI_JDBC_DRIVER_CLASS + "=com.acme.db.Driver))");
ServiceTracker tracker = new ServiceTracker(context, filter, null);
tracker.open();
DataSourceFactory dsf = (DataSourceFactory) tracker.getService();

使用数据库库驱动程序

数据源工厂服务可以被用来获取下面的相关类型的jdbc实例:

javax.sql.DataSource,javax.sql.ConnectionPoolDataSource,javax.sql.XADataSource,

java.sql.Driver

哪种类型的链接体统这是真实被需要的,一类与应用程序和使用案例。对于每种类型来说,数据源工厂服务提供一个方法来返回对应的实例。每个方法拿到一个Properties对象作为参数来传递配置信息到一个数据库驱动程序实现里。这个配置是数据库驱动程序特定的,并且能够用来指明数据库URL以及用户的身份。公用的属性名和他们的配置属性被定义在DataSourceFactory接口中。

一个数据源工厂不需要来实现所有的工厂方法,如果一个实现不支持一种特定类型的方法,那么它必须抛出一个SQL Exception,这个规范不提供依赖数据源工厂服务来实现特定工厂方法的机制。

下面的代码现实一个数据源对象可以创建什么:

Properties props = new Properties();
props.put(DataSourceFactory.JDBC_URL, "jdbc:acme:ACME DB");
props.put(DataSourceFactory.JDBC_USER, "foo");
props.put(DataSourceFactory.JDBC_PASSWORD, "secret");

DataSource dataSource = dsf.createDataSource(props);

数据源工厂接口有一系列的静态域代表了公共的属性key,包括:

• JDBC_DATABASE_NAME
• JDBC_DATASOURCE_NAME
• JDBC_DESCRIPTION
• JDBC_NETWORK_PROTOCOL
• JDBC_PASSWORD
• JDBC_PORT_NUMBER
• JDBC_ROLE_NAME
• JDBC_SERVER_NAME
• JDBC_USER
• JDBC_URL

下面附加的属性key提供给应用程序,创建ConnectionPoolDataSource或者XAPoolDataSource对象。

• JDBC_INITIAL_POOL_SIZE
• JDBC_MAX_IDLE_TIME
• JDBC_MAX_POOL_SIZE
• JDBC_MAX_STATEMENTS
• JDBC_MIN_POOL_SIZE
• JDBC_PROPERTY_CYCLE

哪些属性Key和values是支持的,依赖于驱动程序实现,驱动程序也支持附加的自定义配置属性。

org.osgi.service.jdbc

是jdbc服务包,版本1.0。bundle如果想使用package的话,要将package列示到清单文件的Import-Package头,例如:

Import-Package:org.osgi.service.jdbc;version="[1.0,2.0)"

public interface DataSourceFactory

该接口是JDBC 连接工厂的工厂接口,有三个连接工厂用于获得jdbc连接:javax.sql.DataSource,javax.sql.ConnectionPoolDataSource,javax.sql.XADataSource。数据源的提供者应该是想这个接口并且将其当成OSGI服务注册,当然了,注册时在OSGI_JDBC_DRIVER_CLASS属性上要用JDBC驱动程序类名。

public static final String JDBC_DATABASE_NAME="databaseName".

databaseName属性必须由datasource客户端提供,当在调用createDataSource(Propeties)时。

public static final String JDBC_DATASOURCE_NAME="datasourceName"

同上

public static final String JDBC_DESCRIPTION="description"

同上

public static final String JDBC_INITIAL_POOL_SIZE="initialPoolSize"

同上

....有很多,略过