没有合适的资源?快使用搜索试试~ 我知道了~
DataSource接口介绍与使用
需积分: 49 26 下载量 78 浏览量
2015-10-13
16:55:04
上传
评论 1
收藏 81KB DOC 举报
温馨提示
试读
11页
JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接。JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制。
资源推荐
资源详情
资源评论
DataSource 接口介绍
一、DataSource 接口是一个更好的连接数据源的方法:
JDBC1.0 是原来是用 DriverManager 类来产生一个对数据源的连接。JDBC2.0 用一种替
代的方法,使用 DataSource 的实现,代码变的更小巧精致,也更容易控制。
一个 DataSource 对象代表了一个真正的数据源。根据 DataSource 的实现方法,数据源
既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件。当一个 DataSource
对象注册到名字服务中,应用程序就可以通过名字服务获得 DataSource 对象,并用它来产
生一个与 DataSource 代表的数据源之间的连接。
关于数据源的信息和如何来定位数据源,例如数据库服务器的名字,在哪台机器上,
端口号等等,都包含在 DataSource 对象的属性里面去了。这样,对应用程序的设计来说是
更方便了,因为并不需要硬性的把驱动的名字写死到程序里面去。通常驱动名字中都包含
了驱动提供商的名字,而在 DriverManager 类中通常是这么做的。如果数据源要移植到另
一个数据库驱动中,代码也很容易做修改。所需要做的修改只是更改 DataSource 的相关的
属性。而使用 DataSource 对象的代码不需要做任何改动。
由系统管理员或者有相应权限的人来配置 DataSource 对象。配置 DataSource,包括设
定 DataSource 的属性,然后将它注册到 JNDI 名字服务中去。在注册 DataSource 对象的的
过程中,系统管理员需要把 DataSource 对象和一个逻辑名字关联起来。名字可以是任意的,
通常取成能代表数据源并且容易记住的名字。在下面的例子中,名字起为: InventoryDB,
按照惯例,逻辑名字通常都在 jdbc 的子上下文中。这样,逻辑名字的全名就是:jdbc/
InventoryDB。
一旦配置好了数据源对象,应用程序设计者就可以用它来产生一个与数据源的连接。
下面的代码片段示例了如何用 JNDI 上下文获得一个一个数据源对象,然后如何用数据源
对象产生一个与数据源的连接。开始的两行用的是 JNDI API,第三行用的才是 JDBC 的
API:
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/InventoryDB");
Connection con = ds.getConnection("myPassword", "myUserName");
在一个基本的 DataSource 实现中,DataSource.getConnection 方法返回的 Connection 对
象和用 DriverManager.getConnection 方法返回的 Connection 对象是一样的。因为 DataSource
提供的方便性,我们推荐使用 DataSource 对象来得到一个 Connection 对象。我们希望所以
的基于 JDBC2.0 技术的数据库驱动都包含一个基本的 DataSource 的实现,这样就可以在应
用程序中很容易的使用它。
对于普通的应用程序设计者,是否使用 DataSource 对象只是一个选择问题。但是,对
于那些需要用的连接池或者分布式的事务的应用程序设计者来说,就必须使用 DataSource
对象来获得 Connection,原因在下面我们会提到。
二、Connection pooling(连接池):
连接池是这么一种机制,当应用程序关闭一个 Connection 的时候,这个连接被回收,
而不是被 destroy,因为建立一个连接是一个很费资源的操作。如果能把回收的连接重新利
用,会减少新创建连接的数目,显著的提高运行的性能。
假设应用程序需要建立到一个名字为 EmpolyeeDB 的 DataSource 的连接。使用连接池
得到连接的代码如下:
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");
Connection con = ds.getConnection("myPassword", "myUserName");
除了逻辑名字以外,我们发现其代码和上面举的例子的代码是一样的。逻辑名字不同,就
可以连接到不同的数据库。DataSource 对象的 getConnection 方法返回的 Connection 是否是
一个连接池中的连接完全取决于 DataSource 对象的实现方法。如果 DataSource 对象实现与
一个支持连接池的中间层的服务器一起工作,DataSource 对象就会自动的返回连接池中的
连接,这个连接也是可以重复利用的。
是否使用连接池获得一个连接,在应用程序的代码上是看不出不同的。在使用这个
Connection 连接上也没有什么不一样的地方,唯一的不同是在 java 的 finally 语句块中来关
闭一个连接。在 finally 中关闭连接是一个好的编程习惯。这样,即使方法抛出异常 ,
Connection 也会被关闭并回收到连接池中去。代码应该如下所示:
try{…
}catch(){…
}finally{ if(con!=null)con.close();}
三、分布式事务:
获得一个用来支持分布式事务的连接与获得连接池中的连接是很相似的。同样,不同
之处在于 DataSource 的实现上的不同,而不是在应用程序中获得连接的方式上有什么不同 。
假设 DataSource 的实现可以与支持分布式事务中间层服务器一起工作,得到连接的代码还
是如下所示:
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");
Connection con = ds.getConnection("myPassword", "myUserName");
由于性能上的原因,如果一个 DataSource 能够支持分布式的事务,它同样也可以支持连接
池管理。
从应用程序设计者的观点来看。是否支持分布式的事务的连接对它来说没什么不同,
唯一的不同是在事务的边界上(开始一个事务的地方和结束一个事务的地方),开始一个
事务或者结束一个事务都是由事务服务器来控制的。应用程序不应该做任何可能妨碍服务
的事情。应用程序不能够直接调用事务提交 commit 或者回滚 rollback 操作,也不能够使用
事务的自动提交模式 auto-commit mode(在数据库操作完成的时候自动的调用 commit 或者
rollback)。
在一个连接参与了分布式事务的时候,下面的代码是你不能做的(con 表示支持分布式事
务的连接 Connection)。
con.commit();或者 con.rollback();或者 con.setAutoCommit(true);对于通常的 Connection
来说,缺省的是 auto-commit 模式。而对于支持分布式事务的 Connection 来说,缺省不是
auto-commit 模式。注意,即使 Connection 是支持事务的,它也可以用于没有事务的情况。
关于事务边界的限制只是是对分布式事务的情况下才成立的。
配置支持连接池的 DataSource 的时候,涉及到配置 ConnectionPoolDataSource 对象,
这个对象是三层体系结构中的中间层来管理连接池的。同样的,在配置支持分布式事务的
时候,需要 配置 XADataSource,XADataSource 是中 间层用来 管理分布式事 物的对象 。
ConnectionPoolDataSource 和 XADataSource 是由驱动提供商提供的,对应用程序的设计者
来说是透明的。和基本的 DataSource 一样,系统管理员来配置 ConnectionPoolDataSource
和 XADataSource 对象。
四、结果集(RowSet 接口):
结果集对象是一行行数据的容器。根据其目的,可以通过多种方法实现。RowSet 及其
相关的接口与 JDBC2.0 的标准扩展 API 有点不同,他们并不是驱动的一部分,RowSet 是在
驱动的上层实现的,可以由其它的任何人来实现他们。
任何类型的 rowset 都实现了 RowSet 接口,RowSet 接口扩展了 ResultSet 接口。这样
RowSet 对象就有了 ResultSet 对象所有的功能。能够通过 getXXX 方法得到数据库中的某列
值,通过 updateXXX 方法可以修改某列值,可以移动光标,是当前行变为另一行。
当然,我们更感兴趣的是 RowSet 接口提供的新的功能。作为一个 JavaBean 组件,
RowSet 对象可以增加或者删除一个 listener(监听者),可以 get 或者 set 其属性值,这些
属性中,有一个是字符串,表示一个对数据库 Query 请求,RowSet 接口定义了设定参数的
方法,也提供了执行这个请求的方法。这意味着 RowSet 对象能够执行查询请求,可以根
据它产生的结果集进行计算。同样,RowSet 也可以根据任何表格数据源进行计算,所以,
它不局限于关系数据库。
从数据源得到数据之后,RowSet 对象可以和数据源断开连接,rowset 也可以被序列化。
这样,RowSet 就可以通过网络传递给瘦客户端。
RowSet 可以被重新连接到数据源,这样,做的修改就可以存回到数据源中去。如果产
生了一个 listener,当 RowSet 的当前行移动,或者数据被修改的时候,监听者就会收到通
知。例如,图形用户界面组件可以注册成为监听者,当 RowSet 更改的时候,图形用户界
面接到通知,就可以修改界面,来符合它所表示的 RowSet。
根据不同的需要,RowSet 接口可以通过多种方法来实现。Java software 已经写了一个
CachedRowSet 实现,从 http://developer.java.sun.com/developer/earlyAccess/crs/index.html 中
可以得到这个实现。
与 CachedRowSet 类不样的是,JDBCRowSet 类总是保持一个和数据源的连接。这样,
在 ResultSet 外围 简单 到加了 一层 ,是基 于 JDBC 技术的驱 动看 起来 象是一 个简 单的
JavaBean 组件一样。
总结:JDBC2.0 标准扩展 API 通过见 DataSource 注册到 JNDI 名字服务上,将 JDBC 技
术扩展为一个全新的概念。使应用程序的代码更加精巧,易于控制。新的 API 支持了连接
池,支持分布式的事务。最后,还使 java 应用程序可以在网络上传播结果集,是不可以滚
动的 ResultSet 变成了可以滚动的 RowSet。
11.2.4. DataSource 接口
为了从数据库中取得数据,我们首先需要获取一个数据库连接。 Spring 通过 DataSource 对
象来完成这个工作。 DataSource 是 JDBC 规范的一部分, 它被视为一个通用的数据库连接
剩余10页未读,继续阅读
资源评论
wang_xingshan
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功