In basic terms, a data source is a facility for storing data. It can be as sophisticated as a complex database for a large corporation or as simple as a file with rows and columns. A data source can reside on a remote server, or it can be on a local desktop machine. Applications access a data source using a connection, and aDataSource
object can be thought of as a factory for connections to the particular data source that theDataSource
instance represents.
两者相同点:
Using a DataSource
object is the preferred alternative to using the DriverManager
for establishing a connection to a data source. They are similar to the extent that the DriverManager
class and DataSource
interface both have methods for creating a connection, methods for getting and setting a timeout limit for making a connection, and methods for getting and setting a stream for logging.
两者不同点:
1.Unlike the DriverManager
, a DataSource
object has properties that identify and describe the data source it represents. Also, a DataSource
object works with a JavaTM Naming and Directory InterfaceTM (JNDI) naming service and is created, deployed, and managed separately from the applications that use it. A driver vendor will provide a class that is a basic implementation of the DataSource
interface as part of its JDBC 2.0 or 3.0 driver product.
2.The second major advantage is that the DataSource
facility allows developers to implement a DataSource
class to take advantage of features like connection pooling and distributed transactions.
在JDBC2.0或JDBC3.0中,所有的数据库驱动程序提供商必须提供一个实现了DataSource接口的类,要使用数据源必须首先在JNDI中注册该数据源对象。
如果在JNDI中注册了数据源对象,将会比起使用DriverManager来具有两个方面的优势:
首先,程序不需要像使用DriverManager一样对加载的数据库驱动程序信息进行硬编码,程序员可以选择先在JNDI中注册这个数据源对象,然后在程序中使用一个逻辑名称来引用它,JNDI会自动根据你给出的名称找到与这个名称绑定的DataSource对象。然后就可以使用这个DataSource对象来建立和具体数据库的连接了。
其次,使用实现了DataSource接口的类所具有的第二个优势体现在连接池和分布式事务上。连接池通过对连接的复用而不是新建一个物理连接来显著地提高程序的效率。从而适用于任务繁忙、负担繁重的企业级分布式事务。
数据库连接池的基本原理
传统的数据库连接方式(指通过DriverManager和基本实现DataSource进行连接)中,一个数据库连接对象均对应一个物理数据库连接,数据库连接的建立以及关闭对系统而言是耗费系统资源的操作,在多层结构的应用程序环境中这种耗费资源的动作对系统的性能影响尤为明显。
在多层结构的应用程序中通过连接池(connection pooling)技术可以使系统的性能明显得到提到,连接池意味着当应用程序需要调用一个数据库连接的时,数据库相关的接口通过返回一个通过重用数据库连接来代替重新创建一个数据库连接。通过这种方式,应用程序可以减少对数据库连接操作,尤其在多层环境中多个客户端可以通过共享少量的物理数据库连接来满足系统需求。通过连接池技术Java应用程序不仅可以提高系统性能同时也为系统提高了可测量性。
数据库连接池是运行在后台的而且应用程序的编码没有任何的影响。此中状况存在的前提是应用程序必须通过DataSource对象(一个实现javax.sql.DataSource接口的实例)的方式代替原有通过DriverManager类来获得数据库连接的方式。一个实现javax.sql.DataSource接口的类可以支持也可以不支持数据库连接池,但是两者获得数据库连接的代码基本是相同的。
一个DataSource对象通常注册在JNDI命名服务上,应用程序可以通过标准的方式获得到注册在JNDI服务上的DataSource对象。 代码如下:
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/openbase");
如果当前DataSource不支持数据库连接池,应用程序将获得一个和物理数据库连接对应的Connection对象。而如果当前的DataSource对象支持数据库连接池,应用程序自动获得重用的数据库连接而不用创建新的数据库连接。重用的数据库连接和新建立连接的数据库连接使用上没有任何不同。应用程序可以通过重用的连接正常的访问数据库,进行访问数据的操作,完成操作后应显式的调用close()关闭数据库连接。
Connection con = ds.getConnection("User", "Pwd");
相关数据库的操作;
con.close();
当关闭数据连接后,当前使用的数据库连接将不会被物理关闭,而是放回到数据库连接池中进行重用。
JDBC3.0规范中数据库连接池框架
JDBC3.0规范中通过提供了一个支持数据库连接池的框架,这个框架仅仅规定了如何支持连接池的实现,而连接池的具体实现JDBC 3.0规范并没有做相关的规定。通过这个框架可以让不同角色的开发人员共同实现数据库连接池。
通过JDBC3.0规范可以知道具体数据库连接池的实现可以分为JDBC Driver级和Application Server级。在JDBC Driver级的实现中任何相关的工作均由特定数据库厂商的JDBC Drvier的开发人员来具体实现,即JDBC Driver既需要提供对数据库连接池的支持同时也必须对数据库连接池进行具体实现。而在Application Server级中数据库连接池的实现中特定数据库厂商的JDBC Driver开发人员和Application Server开发人员来共同实现数据库连接池的实现(但是现在大多数Application Server厂商实现的连接池的机制和规范中提到有差异),其中特定数据库厂商的JDBC Driver提供数据库连接池的支持而特定的Application Server厂商提供数据库连接池的具体实现。
JDBC3.0规范规定了如下的类和接口来支持数据库连接池的实现。
javax.sql.ConnectionEvent
javax.sql.ConnectionPoolDataSource
javax.sql.PooledConnection
javax.sql.ConnectionEventListener
其中除javax.sql.ConnectionEvent是类,其它的均为接口。
C:\1.jpg
screen.width-333)this.width=screen.width-333;" src="/Develop/ArticleImages/19/19446/CSDN_Dev_Image_2003-7-41948411.jpg">
JDBC3.0连接池框架的关系图
通过此图可以大概的了解相关接口在一个典型的三层环境中应用程序的位置。
数据库连接池实现层次中,由特定数据库厂商的JDBC Driver开发人员提供连接池支持,而特定Application Server提供连接池实现的情况比较复杂,其它的实现层次均可视为其简化情况的一种。下面将针对这种情况进行说明。
在这个框架主要有两个用户角色存在,它们分别是:
特定数据库厂商的JDBC Driver开发人员,之后将简称为Driver Vendor
特定Application Server中连接池开发人员,之后将简称为Pooling Vendor
C:\2.bmp
screen.width-333)this.width=screen.width-333;" src="/Develop/ArticleImages/19/19446/CSDN_Dev_Image_2003-7-41948413.gif">
JDBC3.0规范中在上述情况下各个接口和类之间的UML图
下面对几个关键模块进行详细的说明:
Driver Vendor DataSource:
Driver Vendor必须提供一个ConnectionPoolDataSource 接口的具体实现,通过这个接口Pooling Vendor可以得到一个PooledConnection对象,从而使第三方实现的连接池可以使用特定数据库厂商得到JDBC Driver产生的数据库连接。在这里ConnectionPoolDataSource接口扮演的角色可以视为产生PooledConnection 对象的工厂。
Driver Vendor PooledConnection:
Driver Vendor必须提供标准PooledConnection 接口实现的类,这个接口允许Pooling Vendor在JDBC Driver提供连接池支持的基础上实现连接池。一个具体PooledConnection对象代表了一个物理的数据库连接;由PooledConnection对象创建Connection对象仅仅只是一个指向PooledConnetion对象的句柄。在JDBC 3.0连接池实现框架中PooledConnection对象扮演的角色可以视为产生Connection对象的工厂。
Pooling Vendor DataSource:
Pooling Vendor必须实现DataSource接口,这个接口是和连接池实现模块进行交互的入口点。ConnectionPoolDataSource根据需要创建PooledConnection对象。
Pooling Vendor Connection Cache:
此模块是Pooling Vendor对连接池的具体实现。JDBC 3.0 规范没有规定在DataSource对象和数据库连接池实现之间的需要实现的接口,所以它们之间的交互由Pooling Vendor自己定义。一般而言,一个数据库连接池的具体实现包含了一个或若干个具体的类,但是在连接池实现模块中必须包含一个类实现标准ConnectionEventListener接口。当一个PooledConnectiond对象被关闭或者出现异常的时候,PooledConnection对象将会向ConnectionEventListener接口发送ConnectionEvent对象,连接池实现模块将会根据返回的ConnectionEvent对象对PooledConnection进行关闭或者重用操作。
ConnectionEvent:
实现连接池时,当应用程序调用Connection.close()试图去关闭数据库连接时,这时需要有一个通告给连接池实现模块,通告对当前的数据库物理连接(PooledConnection 对象)进行重用。为了使连接池实现模块能得到这种"通告",连接池实现模块必须实现ConnectionEventListener接口,而且同时需要注册成为PooledConnection对象的监听者。连接池实现模块通过PooledConnection.addConnectionEventListener()方法注册自己成为一个监听者。
在典型三层环境中具体调用流程:
当应用程序通过调用DataSource.getConnection()得到一个数据库连接。
Pooling Vendor实现的DataSource对象在连接池中进行查找看当前是否有有效的PooledConnection对象,如果连接池中有可用的PooledConnection,则进行检查,如果当前的PooledConnection可用则使用。
如果如果连接池中没有可用的PooledConnection对象,或者当前的PooledConnection对象不正确,那么Pooling Vendor调用ConnectionPoolDataSource.getPooledConnection类创建一个新的PooledConnection对象,这时由Driver Vendor实现的ConnectionPoolDataSource将会创建一个满足要求新的PooledConnection对象,并将其返回给连接池实现模块进行管理。
然后,Pooling Vendor会调用PooledConnection.getConnection()获得一个逻辑的Connection对象,这个逻辑的Connection对象将会象正常的Connection对象返回给应用程序。这个逻辑Connection对象实际上是连接池中PooledConnection对象的一个句柄,当连接池有效时,应用程序调用DataSource.getConnection()就会得到这个句柄。简而言之,应用程序此时使用的Connection对象仅仅是其创建者PooledConnection对象的句柄而已。
连接池实现模块调用PooledConnection.addConnectionEventListener()将自己注册成为一个PooledConnection对象的监听者,当数据库连接需要重用或者关闭的时候连接池实现模块可以得到通告。
当应用程序通过调用Connection.close()来关闭数据库连接,这时一个ConnectionEvent对象被创建并被返回到连接池实现模块,连接池实现模块接受到此通告后,将PooledConnection对象返回到池中进行重用。这些过程中其它角色都不能访问PooledConnection.close()方法,能访问这个方法的只有Pooling Vendor,它们使用这个方法对连接池中的对象进行操作,通过PooledConnection.close()方法可以关闭物理数据库连接。
转自:http://blog.sina.com.cn/s/blog_4e57731f0100bfsj.html
分享到:
相关推荐
在一个基本的DataSource实现中,DataSource.getConnection方法返回的Connection对象和用DriverManager.getConnection方法返回的Connection对象是一样的。因为DataSource提供的方便性,我们推荐使用DataSource对象来...
相比于传统的JDBC通过 `Class.forName()` 和 `DriverManager.getConnection()` 获取连接的方式,`DataSource`提供了更高效、更灵活的连接管理机制。这是因为`DataSource`支持连接池技术,可以复用已存在的数据库连接...
相比于直接使用`DriverManager`来获取连接,DataSource提供了更好的性能和连接池功能,能够有效管理数据库连接,避免资源浪费。 2. **连接池**: 连接池是一种预创建并管理数据库连接的技术,它可以提高应用程序的...
在Java数据库连接(JDBC)中,`DriverManager.registerDriver(new Driver())` 是一个关键的步骤,用于将数据库驱动程序注册到JDBC的`DriverManager`中,以便后续的数据库连接操作。这个过程通常在应用程序启动时进行...
DataSource 对象所表示的物理数据源的连接,作为 DriverManager 工具的替代项。DataSource 能提供最高性能的对数据库的并发访问,数据源技术是 Java 操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的...
安装驱动后,开发者可以通过创建DataSource或DriverManager.getConnection()方法来建立连接。 2. SQL Server数据库驱动:SQL Server是由Microsoft开发的关系型数据库,适用于大型企业级应用。对于Java开发者,...
首先,JDBC提供了两种方式来连接数据库:DriverManager和DataSource。DriverManager是基础级别的连接方法,适合小型项目,而DataSource是更高级、更高效的连接池管理方式,适用于企业级应用,它可以提高性能并有效...
这通常涉及以下步骤:加载JDBC驱动、创建数据库连接(DataSource或DriverManager)、建立Statement或PreparedStatement对象,最后执行SQL语句。 1. 数据库连接:使用JDBC,我们可以通过DataSource或DriverManager类...
2. 连接数据库:创建一个Connection对象,使用DataSource或DriverManager。 ```java import java.sql.Connection; import java.sql.DriverManager; // 使用DriverManager String url = "jdbc:mysql://localhost:...
3. **DataSource与DriverManager**:两种不同级别的数据库连接管理,DataSource更适合服务器环境,DriverManager则简单易用。 4. **面向对象编程**:代码结构遵循OOP原则,确保代码的可读性和可维护性。 5. **数据库...
本文将从标题和描述中提及的知识点出发,详细探讨SQL Server 2005数据库连接的两种主要方式——通过`java.sql.DriverManager`类和`DataSource`接口,并对部分代码进行深度分析。 #### 一、使用`java.sql....
在实际开发中,我们通常会先在项目中引入特定数据库的JDBC驱动,然后通过DataSource或DriverManager建立数据库连接。使用PreparedStatement执行SQL,处理结果集,最后关闭资源以释放数据库连接。对于大型应用,...
在JDBC中,我们可以通过DriverManager.getConnection()创建(而不是获取)一个Connection,在完成CRUD之后,再去销毁该Connection。在并发量不高的情况下,创建销毁Connection所花费的时间和资源是可以接受,但是随着...
使用这些驱动包时,开发者需要在Java代码中加载适当的驱动,并通过DataSource或DriverManager来建立数据库连接。例如: ```java // 加载驱动 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // ...
4. **DataSource vs DriverManager**: 在这里,项目没有使用DataSource来获取连接,而是通过DriverManager。DataSource是更推荐的方式,因为它支持连接池,能有效管理数据库连接,提高系统性能。但此处可能考虑到...
相比于传统的DriverManager.getConnection()方法,DataSource提供了更高效、更安全、更易于管理的连接方式。 2. **连接池**: 连接工厂的核心功能之一是实现数据库连接池。连接池预先创建并维护一定数量的数据库连接...
相比于传统的DriverManager,`DataSource`提供了连接池功能,能有效提高性能,减少资源消耗。通过设置不同的属性,我们可以适应不同数据库系统的需求。 描述中提到的"任意配置properties",这指的是使用配置文件来...
- **连接管理**:JDBC(Java Database Connectivity)是Java连接Oracle的主要方式,通过DataSource或DriverManager实现数据库连接。 3. **JSP与Oracle整合**: - **JDBC连接**:使用JDBC API,通过DataSource或...
DataSource ds = (DataSource) envCtx.lookup("jdbc/MyDB"); Connection conn = ds.getConnection(); ``` 4. 数据库连接池(如ConnectionPool): 连接池是一种管理数据库连接的机制,它预先创建并维护一定数量的...
DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUsername("root"); dataSource.setPassword("password"); ``` C3P0则是另一个广泛...