编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

javax.sql包中所包含内容及其使用

相对于java.sql包中的类和接口,Javax.sql包关注一些比较高级的数据库应用。例如:

数据源

连接池

分布式事务处理

行记录集

1、数据源

在Java中,datasource对象就是一个代表数据源实体的对象。一个数据源就是一个用来存储数据的工具,他可以是复杂的大型企业级数据库,也可以是只有行和列的文件。数据源可以位于服务器端,也可以位于客户器端。

应用程序通过1个连接来访问数据源,datasource对象是用于提供连接数据源的工具。Datasource接口提供了2种建立数据源连接的方法。

Javax.sql包提供编好的数据源连接-datasource,它类似于java.sql包提供的DriverManager,两者的使用范围也很相似,都提供了建立和数据库连接的方法,设置连接的最大超时时间,获取流,登录。

但2者的区别也很明显。新的Datasource机制提供了很多DriverManager机制所没有的优势。

应用程序不必硬编码一个驱动程序类

可以对数据源的属性进行修改,这就意味着当数据源或驱动程序改变时,不需要修改应用程序的代码。

通过与中间层协同工作的Datasource类就可实现连接池和分布式事务处理。

一个Datasource对象能够识别和描述它所代表的数据源和属性。而且Datasource对象的工作和JNDI具有密切的关系。Datasource的建立、发布、独立于应用程序的管理都依靠该技术。

程序不需要像使用DriverManager一样对加载的数据库驱动程序信息进行硬编码,开发人员可以选择现在JNDI中注册这个数据源对象,然后在程序中使用一个逻辑名称来引用它,JNDI会自动根据给出的名称找到与其绑定的DataSource对象。最后建立和具体数据库的连接。

此外,使用DataSource接口的类所具有的优势还体现在连接池和分布式事务上。连接池通过对连接的复用而不是新建一个物流连接来提高数据库的效率,从而适用于任务繁忙、负担繁重的企业级分布式事务。

2、连接池

JDBC3.0连接池类

Javax.sql.ConnectionEvent

JDBC3.0连接池接口

Javax.sql.ConnectionPoolDataSource

Javax.sql.PooledConnection

Javax.sql.ConnectionEventListener

使用连接池的过程

应用程序通过调用DataSource.getConnection()得到一个数据库连接

DataSource对象在连接池中进行查找看当前是否有有效的PooledConnection对象,如果连接池中有可用的PooledConnection对象,则对其进行检查,并分配给应用程序使用。

如果连接池中没有可用的PooledConnection对象,或者当前的PooledConnection对象不正确,那么调用ConnectionPoolDataSource.getPooledConnection类创建一个新的PooledConnection对象,这时由容器实现的ConnectionPoolDataSource将会创建一个满足要求的新的PooledConnection对象,并将其返回给连接池,实现模块进行管理。

其实当调用PooledConnection.getConnection()获得一个逻辑的Connection对象,这个逻辑的Connection对象将会像正常的Connection对象返回给应用程序。这个Connection对象实际上是连接池中PooledConnection对象的一个引用,当连接池有效时,应用程序调用DataSource.getConnection()就会得到这个引用。反正,这需要创建。

连接池实现模块调用PooledConnection.addConnectionEventListener()将自己注册成为一个PooledConnection对象的监听者,当数据库连接需要重用或关闭的时候,连接池实现模块讲得到通告。

当应用程序通过调用Connection.close()来关闭数据库连接,这时一个ConnectionEvent对象被创建并返回到连接池实现模块,连接池实现模块接受到此通告后,将PooledConnection对象返回到池中进行重用。这些过程中其他对象都不能访问PooledConnection.close()方法,能访问这个方法的只有PoolingVendor,他们使用这个方法对连接池中的对象进行操作,通过PooledConnection.close()方法可以关闭物理数据库连接。

3、分布式事务处理

当数据分布在多个数据库服务器上时,就需要各种保护措施来保证数据正确地写到所有数据库中。

4、行记录集

RowSet对象是表格式数据的容器,封装了一组从数据源获取的数据行。在RowSet接口的基本实现是从JDBC数据源中获取数据行。由于行集是可以定制的,所以行集中的数据可以来自电子数据表,平面文件或者其他任何表格样式的数据源。RowSet对象是ResultSet接口的扩展,能够执行ResultSet对象可以执行的任何操作。RowSet接口与ResultSet类似,本质上都是数据库的查询结果。但是RowSet对象是可滚动、可更新、更高效的。

RowSet对象是JavaBean组件,有JavaBean属性,并遵循其事件模型。另外RowSet对象的属性也允许该对象建立自己的数据库连接,执行查询操作。此外,RowSet可以是disconnected的,也就是说使用行集的过程中,不必一直保持到数据源的打开连接。行集是可以串行化,所以可以通过网络把它发送到远程对象中。

RowSet接口提供了一组基本方法,这些方法对于所有行集都是通用的。因为所有的RowSet对象都是JavaBean组件,因此,RowSet接口具有添加和删除event listener的方法,也有get/set RowSet对象所有属性的方法。RowSet对象的大多数属性都支持建立连接或者执行行命令。为了执行查询,更新等SQL语句。并能够生成从中获取数据的结果集,行集会使用到数据源的连接。

若一个组件希望得到在RowSet对象上发生的事件通知,它就应该首先实现RowSetListener接口,并向RowSet对象进行注册。这就是listener,一个GUI组件。这样每当行集产生事件时,listener都会得到事件的通知,这样就能保持它的游标位置和数据与行集的内容一致。

虽然它生了JDBC API的一个部分,但RowSet接口其实是独立存在的。它是一层浮在JDBC API上执行的软件,RowSet的具体实现能够被任何人,包括JDBC驱动提供商将其作为驱动的一部分来提供。

未经允许不得转载: 技术文章 » Java编程 » javax.sql包中所包含内容及其使用