论文部分内容阅读
摘 要:JDBC驱动数据库连接是基于JAVA对数据库应用的首要问题,针对当前形形色色的数据库连接驱动程序,结合网络数据库开发的服务器配置、数据库驱动程序的安装、数据库数据的存储、连接的效率和资源的占用情况,探讨了JDBC4.0在数据库连接处理方面的应用和技术要点,逐步了解JDBC4.0关于数据库连接池的功能。对JDBC4.0的数据连接处理方面进行初探。
关键词:JDBC4.0; 数据库连接; 数据库连接池
(JDBC)自1997年的产生至今,JDBC类库已被广泛的接受和实现。类库的灵活性使得它可以有很多个具体实现。 增强Connection和Statement接口,改善对连接状态的跟踪,在池环境中对状态对象的管理更具灵活性。 Statement :增加了isClosed和getResultSetHoldability方法。JDBC API提供了让java程序访问一个或多个数据源的方法。
1.JDBC4.0初探
1.1 数据库连接
要获取一个连接,应用程序可以与以下两者交互:
DriverManager类与一个或多个Driver实现协作
一个DataSource实现
使用DataSource对象是一个较好的方法,因为它增强了应用程序的可移植性。它使得维护更方便,并使得应用程序可以透明的使用连接池和分布性事务。所有J2EE组件都使用DataSource对象与数据源建立并获得连接。
本章描述不同类型的JDBC驱动和对Driver接口、DriverManager类和基础DataSource接口的使用。DataSource实现支持连接池和分布性事务。
1. 驱动类型
1) Type1—作为其他数据访问API的影射实现JDBC API,如ODBC.
2) Type2—部分用java语言编写,部分用原生代码.驱动使用原生客户库指定连接的数据源.
3) Type3—使用纯JAVA客户端并通过中间件服务器使用独立于数据库的协议来通信.之后,中间件服务器把客户传送到数据源.
4) 使用纯JAVA并对指定数据源实现网络协议.客户端直接连接到数据源.
前两种类型因为原生代码的关系,它的移植性受到限制.
2. Driver接口
JDBC驱动必须实现Driver接口,该实现必须包含一个静态初始化器,该初始化器在驱动加载时被调用。该初始化器用DriverManager把自己注册成一个新实例。
代码如例 4-1:
public class AcmeJdbcDriver implements java.sql.Driver{
static {
java.sql.DriverManager.registerDriver(new AcmeJdbcDriver());
}
…
}
3. DriverManager类
DriverManager类与Driver借口协作来管理JDBC客护端可用的驱动集.当客户请求连接并提供了URL,DriverManager负责寻找一个认识该URL的驱动,并用该驱动连接到对应的数据源。
例4-2:使用传统方法利用DriverManager类获得一个数据库连接.
{
...
//载入数据库驱动并实例化之
Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
//获得数据库物理连接
Connection conn=DriverManager.getConnection(url,somUser,somPw);
...
}
类DriverManager与接口Driver和Connection的关系
如图4-1及4-2所示:DriverManager可以注册多个数据库驱动,而每种驱动(实例)可提供多个物理连接。
图4-2传统方法中应用程序请求一个数据库连接的大致流程
如图2所示,应用程序在请求一个数据库连接时的流程如下:
1) 首先由JVM(Java虚拟机)载入数据库厂商依赖(vender dependent)的数据库驱动程序并注册该驱动。
另外,JDBC规范规定:任何JDBC驱动必须实现Driver接口,而且必须包含一个静态构造器(class constructor,也叫类构造器,这里的构造器相当于C++中的构造函数),该构造器的内容如例2代码段:
实施(implement)接口Driver的驱动程序应包含的静态构造器的内容
Public class SomeDriver implements java.sql.Driver{
Static{
java.sql.DriverManager.registerDriver(new SomeDriver());
}
...
}
正如你所看到的一样:数据库驱动程序被载入JVM后实例化的同时,已经隐含了注册的过程(类构造器在类被载入JVM后将被立即调用),这也就是为么语句Class.forName(driverName).newInstance()与DriverManager.registerDriver(SomeDriver)能达到同等效果的原因。
2) 当数据库驱动成功载入并注册后,接下来就可以使用诸如DriverManager.getConnection(
url,someUser,somePw)类方法获得对应URL的数据库连接对象.
其实DriverManager.getConnection(url,someUser,somePw)等方法的具体实施大致如下:在数据库驱动加载并成功注册的前提下,JDBC驱动必须实现Driver接口,该实现必须包含一个静态初始化器,该初始化器在驱动加载时被调用。该初始化器用DriverManager把自己注册成一个新实例。代码如例 10-1: public class AcmeJdbcDriver implements java.sql.Driver{
static {
java.sql.DriverManager.registerDriver(new AcmeJdbcDriver());
}
…
当应用程序载入一个Driver实现,静态初始化器会自动注册一个驱动的实例。
为保证可以通过该机制载入驱动,各驱动需要提供一个niladic构造函数。
当想与注册过的驱动交互时,DriverManager类调用Driver方法。Driver接口也包括acceptsURL方法。DriverManager可以使用该方法来决定对给定的URL哪个注册的驱动可以被使用。
当DriverManager试图建立一个连接时,它会调用驱动的connect方法并传递驱动的URL。如果Driver的实现知道该URL,它会返回一个Connection对象;否则返回null。
1.2数据库连接池
在基础DataSource实现中,客户端Connection对象和物理数据库连接是1:1对应的关系。当Connection对象关闭时,物理连接也被丢弃。因此,在每个客户会话中都会带来打开、初始化和关闭物理连接的过度使用。
连接池通过维护一个物理数据库连接存贮区,解决了这个问题。它可以被客户会话反复使用。连接池极大的提高了性能和可伸缩性,尤其在三层环境中多客户端或以共享较小的物理数据库连接数。图5-1,JDBC驱动提供了一个ConnectionPoolDataSource实现,应用服务器可以用来建立和管理连接池。
用来管理连接池的算法是专门实现的而且随着应用服务器的不同而不同。
DataSource实现连接池除了提高性能和可伸缩性以外,JDBC应用看不出在获取DataSource对象来实现连接池和不获取之间有任何不同。然而,在应用服务器和驱动级实现之间有一些重要的区别。一个基础DataSource实现,没有实现连接池,典型的,由JDBC驱动厂商提供。在基础DataSource实现中,下面的是真实的:
DataSource.getConnection方法创建一个新的Connection对象,来代表一个物理连接并封装对该连接的所有安装和管理工作。
Connection.close方法关闭物理连接并释放相关资源。
在包括连接池的DataSource实现中,在幕后有一系列重大事件发生。在如上实现中,下面的是真实的:
DataSource实现包括一个实现的指定连接池模块会管理一缓冲区的PooledConnection对象。DataSource对象典型的由应用服务器实现作为一层在驱动实现ConnectionPoolDataSource和PooledConnection接口的顶层。
DataSource.getConnection调用PooledConnection.getConnection方法来获得一个指定物理连接的逻辑句柄。只有当连接池中没有可用的连接时,才会出现建立新物理连接的花费。当需要一个新的物理连接时,连接池管理器会调用ConnectionPoolDataSource的getPooledConnection方法来创建一个。管理物理连接的工作由PooledConnection对象代理。
Connection.close方法关闭逻辑句柄,但物理连接还存在。连接池管理器被通知指定的PooledConnection对象现在可以重用了。如果应用程序试图重用逻辑句柄,Connection实现会抛出一个SQLException。
单一一个物理PooledConnection对象会在生命期内产生许多逻辑Connection对象。对一个给定的PooledConnection对象,只有最新生成的逻辑Connection对象才有效。
一个连接池管理器通过调用PooledConnection.close方法关闭物理连接。
2. 结语
经过上述阐述和代码实战演练,JDBC4.0显示了它强大的数据库连接能力,充分吸收了JDBC其他版本中和其他数据库连接驱动的优点和特性,为数据库编程打下一个夯实的基础。
参考文献
[1](美)George Reese.JDBC与Java数据库编程[M].中国电力出版社,2002.3.
[2](美) Sun Microsystems, Inc.JDBC4.0 Documention[J].2003
关键词:JDBC4.0; 数据库连接; 数据库连接池
(JDBC)自1997年的产生至今,JDBC类库已被广泛的接受和实现。类库的灵活性使得它可以有很多个具体实现。 增强Connection和Statement接口,改善对连接状态的跟踪,在池环境中对状态对象的管理更具灵活性。 Statement :增加了isClosed和getResultSetHoldability方法。JDBC API提供了让java程序访问一个或多个数据源的方法。
1.JDBC4.0初探
1.1 数据库连接
要获取一个连接,应用程序可以与以下两者交互:
DriverManager类与一个或多个Driver实现协作
一个DataSource实现
使用DataSource对象是一个较好的方法,因为它增强了应用程序的可移植性。它使得维护更方便,并使得应用程序可以透明的使用连接池和分布性事务。所有J2EE组件都使用DataSource对象与数据源建立并获得连接。
本章描述不同类型的JDBC驱动和对Driver接口、DriverManager类和基础DataSource接口的使用。DataSource实现支持连接池和分布性事务。
1. 驱动类型
1) Type1—作为其他数据访问API的影射实现JDBC API,如ODBC.
2) Type2—部分用java语言编写,部分用原生代码.驱动使用原生客户库指定连接的数据源.
3) Type3—使用纯JAVA客户端并通过中间件服务器使用独立于数据库的协议来通信.之后,中间件服务器把客户传送到数据源.
4) 使用纯JAVA并对指定数据源实现网络协议.客户端直接连接到数据源.
前两种类型因为原生代码的关系,它的移植性受到限制.
2. Driver接口
JDBC驱动必须实现Driver接口,该实现必须包含一个静态初始化器,该初始化器在驱动加载时被调用。该初始化器用DriverManager把自己注册成一个新实例。
代码如例 4-1:
public class AcmeJdbcDriver implements java.sql.Driver{
static {
java.sql.DriverManager.registerDriver(new AcmeJdbcDriver());
}
…
}
3. DriverManager类
DriverManager类与Driver借口协作来管理JDBC客护端可用的驱动集.当客户请求连接并提供了URL,DriverManager负责寻找一个认识该URL的驱动,并用该驱动连接到对应的数据源。
例4-2:使用传统方法利用DriverManager类获得一个数据库连接.
{
...
//载入数据库驱动并实例化之
Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
//获得数据库物理连接
Connection conn=DriverManager.getConnection(url,somUser,somPw);
...
}
类DriverManager与接口Driver和Connection的关系
如图4-1及4-2所示:DriverManager可以注册多个数据库驱动,而每种驱动(实例)可提供多个物理连接。
图4-2传统方法中应用程序请求一个数据库连接的大致流程
如图2所示,应用程序在请求一个数据库连接时的流程如下:
1) 首先由JVM(Java虚拟机)载入数据库厂商依赖(vender dependent)的数据库驱动程序并注册该驱动。
另外,JDBC规范规定:任何JDBC驱动必须实现Driver接口,而且必须包含一个静态构造器(class constructor,也叫类构造器,这里的构造器相当于C++中的构造函数),该构造器的内容如例2代码段:
实施(implement)接口Driver的驱动程序应包含的静态构造器的内容
Public class SomeDriver implements java.sql.Driver{
Static{
java.sql.DriverManager.registerDriver(new SomeDriver());
}
...
}
正如你所看到的一样:数据库驱动程序被载入JVM后实例化的同时,已经隐含了注册的过程(类构造器在类被载入JVM后将被立即调用),这也就是为么语句Class.forName(driverName).newInstance()与DriverManager.registerDriver(SomeDriver)能达到同等效果的原因。
2) 当数据库驱动成功载入并注册后,接下来就可以使用诸如DriverManager.getConnection(
url,someUser,somePw)类方法获得对应URL的数据库连接对象.
其实DriverManager.getConnection(url,someUser,somePw)等方法的具体实施大致如下:在数据库驱动加载并成功注册的前提下,JDBC驱动必须实现Driver接口,该实现必须包含一个静态初始化器,该初始化器在驱动加载时被调用。该初始化器用DriverManager把自己注册成一个新实例。代码如例 10-1: public class AcmeJdbcDriver implements java.sql.Driver{
static {
java.sql.DriverManager.registerDriver(new AcmeJdbcDriver());
}
…
当应用程序载入一个Driver实现,静态初始化器会自动注册一个驱动的实例。
为保证可以通过该机制载入驱动,各驱动需要提供一个niladic构造函数。
当想与注册过的驱动交互时,DriverManager类调用Driver方法。Driver接口也包括acceptsURL方法。DriverManager可以使用该方法来决定对给定的URL哪个注册的驱动可以被使用。
当DriverManager试图建立一个连接时,它会调用驱动的connect方法并传递驱动的URL。如果Driver的实现知道该URL,它会返回一个Connection对象;否则返回null。
1.2数据库连接池
在基础DataSource实现中,客户端Connection对象和物理数据库连接是1:1对应的关系。当Connection对象关闭时,物理连接也被丢弃。因此,在每个客户会话中都会带来打开、初始化和关闭物理连接的过度使用。
连接池通过维护一个物理数据库连接存贮区,解决了这个问题。它可以被客户会话反复使用。连接池极大的提高了性能和可伸缩性,尤其在三层环境中多客户端或以共享较小的物理数据库连接数。图5-1,JDBC驱动提供了一个ConnectionPoolDataSource实现,应用服务器可以用来建立和管理连接池。
用来管理连接池的算法是专门实现的而且随着应用服务器的不同而不同。
DataSource实现连接池除了提高性能和可伸缩性以外,JDBC应用看不出在获取DataSource对象来实现连接池和不获取之间有任何不同。然而,在应用服务器和驱动级实现之间有一些重要的区别。一个基础DataSource实现,没有实现连接池,典型的,由JDBC驱动厂商提供。在基础DataSource实现中,下面的是真实的:
DataSource.getConnection方法创建一个新的Connection对象,来代表一个物理连接并封装对该连接的所有安装和管理工作。
Connection.close方法关闭物理连接并释放相关资源。
在包括连接池的DataSource实现中,在幕后有一系列重大事件发生。在如上实现中,下面的是真实的:
DataSource实现包括一个实现的指定连接池模块会管理一缓冲区的PooledConnection对象。DataSource对象典型的由应用服务器实现作为一层在驱动实现ConnectionPoolDataSource和PooledConnection接口的顶层。
DataSource.getConnection调用PooledConnection.getConnection方法来获得一个指定物理连接的逻辑句柄。只有当连接池中没有可用的连接时,才会出现建立新物理连接的花费。当需要一个新的物理连接时,连接池管理器会调用ConnectionPoolDataSource的getPooledConnection方法来创建一个。管理物理连接的工作由PooledConnection对象代理。
Connection.close方法关闭逻辑句柄,但物理连接还存在。连接池管理器被通知指定的PooledConnection对象现在可以重用了。如果应用程序试图重用逻辑句柄,Connection实现会抛出一个SQLException。
单一一个物理PooledConnection对象会在生命期内产生许多逻辑Connection对象。对一个给定的PooledConnection对象,只有最新生成的逻辑Connection对象才有效。
一个连接池管理器通过调用PooledConnection.close方法关闭物理连接。
2. 结语
经过上述阐述和代码实战演练,JDBC4.0显示了它强大的数据库连接能力,充分吸收了JDBC其他版本中和其他数据库连接驱动的优点和特性,为数据库编程打下一个夯实的基础。
参考文献
[1](美)George Reese.JDBC与Java数据库编程[M].中国电力出版社,2002.3.
[2](美) Sun Microsystems, Inc.JDBC4.0 Documention[J].2003