创建 JDBC 数据源
数 据 源 是 在 JDBC 2.0 中 引 入 的 一 个 概 念 。 在 JDBC 2.0 扩 展 包 中 定 义 了
javax.sql.DataSource 接口来描述这个概念。如果用户希望建立一个数据库连接,通过查询在
JNDITM 服务中的数据源,可以从数据源中获取相应的数据库连接。这样用户就只需要提供
一个逻辑名称(Logic Name),而不是数据库登录的具体细节。
JNDITM 的全称是 Java Naming and Directory Interface, 可以理解为 Java 名称和目录服
务接口。JNDI 向应用程序提供了一个查询和使用远程服务的机制。这些远程服务可以是任
何企业服务。对于 JDBC 应用程序来说,JNDI 提供的是数据库连接服务。JNDI 使应用程序
通过使用逻辑名称获取对象和对象提供的服务,从而使程序员可以避免使用与提供对象的机
构有关联的代码。
一个 DataSource 对象代表一个实际的数据源。在数据源中存储了所有建立数据库连接
的信息。系统管理员用一个逻辑名字对应 DataSource 对象,这个名字可以是任意的。在下
面的例子中 DataSource 对象的名字是 NativeDB。依照传统习惯, DataSource 对象的名字包含
在 jdbc/下,所以这个数据源对象的完整名字是:jdbc/NativeDB。
数据源的逻辑名字确定之后,就需要向 JNDI 服务注册该数据源。下面的代码展示了向
JNDI 服务注册数据源的过程。
// 初始化名称-目录服务环境 Context ctx = null; try{ Hashtable env = new Hashtable (5); env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put (Context.PROVIDER_URL, "file:JNDI"); ctx = new InitialContext(env); } catch (NamingException ne) { ne.printStackTrace(); } bind(ctx, "jdbc/NativeDB");
程序首先生成了一个 Context 实例。javax.naming.Context 接口定义了名称服务环境
(Naming Context)及该环境支持的操作。名称服务环境实际上是由名称和对象间的相互映射
组 成 的 。 程 序 中 初 始 化 名 称 服 务 环 境 的 环 境 工 厂 (Context Factory) 是
com.sun.jndi.fscontext.RefFSContextFactory(该类在 fscontext.jar 中可以找到,由于 fscontext.jar
中包含的不是标准的 API,用户需要从 www.javasoft.com 中的 JNDI 专区下载 fscontext.jar)
类,环境工厂的作用是生成名称服务环境的实例。javax.naming.spi.InitialContextFactory 接口
定义了环境工厂应该如何初始化名称服务环境(该接口在 providerutil.jar 中实现,由于
providerutil.jar 中包含的不是标准的 API,用户需要从 www.javasoft.com 中的 JNDI 专区下载
providerutil.jar)。在初始化名称服务环境时还需要定义环境的 URL。程序中使用的是
"file:JNDI",也就是把环境保存在本地硬盘的 JNDI 目录下。目前很多 J2EETM 应用服务器
都实现了自己的 JNDI 服务,用户可以选用这些服务包。
初始化了名称服务环境后,就可以把数据源实例注册到名称服务环境中。注册时调用
javax.naming.Context.bind()方法,参数为注册名称和注册对象。注册成功后,在 JNDI 目录
下会生成一个.binding 文件,该文件记录了当前名称-服务环境拥有的名称及对象。具体实现
如下例所示:
void bind (Context ctx, String ln)throws NamingException, SQLException { // 创建一个 DmdbDataSource 实例 DmdbDataSource dmds = new DmdbDataSource (); // 把 DmdbDataSource 实例注册到 JNDI 中 ctx.bind (ln, dmds); }
当需要在名称服务环境中查询一个对象时,需要调用 javax.naming.Context.lookup()
方法,并把查询到的对象显式转化为数据源对象。然后通过该数据源对象进行数据库操作。
DataSource ds = (DataSource) lookup (ctx, "jdbc/NativeDB"); Connection conn = ds.getConnection();
DataSource 对象中获得的 Connection 对象和用 DriverManager.getConnection 方法获得的
对象是等同的。由于 DataSource 方法具有很多优点,该方法成为获得连接的推荐方法。
评论