用DriverManager和DataSource获得Connection的区别在哪

用DriverManager和DataSource获得Connection的区别在哪,第1张

在JDBC20或JDBC30中,所有的数据库驱动程序提供商必须提供一个实现了DataSource接口的类,要使用数据源必须首先在JNDI中注册该数据源对象

如果在JNDI中注册了数据源对象,将会比起使用DriverManager来具有两个方面的优势:

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

其次,使用实现了DataSource接口的类所具有的第二个优势体现在连接池和分布式事务上。连接池通过对连接的复用而不是新建一个物理连接来显著地提高程序的效率。从而适用于任务繁忙、负担繁重的企业级分布式事务。

数据库连接池的基本原理

传统的数据库连接方式(指通过DriverManager和基本实现DataSource进行连接)中,一个数据库连接对象均对应一个物理数据库连接,数 据库连接的建立以及关闭对系统而言是耗费系统资源的 *** 作,在多层结构的应用程序环境中这种耗费资源的动作对系统的性能影响尤为明显。

在多层结构的应用程序中通过连接池(connection pooling)技术可以使系统的性能明显得到提到,连接池意味着当应用程序需要调用一个数据库连接的时,数据库相关的接口通过返回一个通过重用数据库连 接来代替重新创建一个数据库连接。通过这种方式,应用程序可以减少对数据库连接 *** 作,尤其在多层环境中多个客户端可以通过共享少量的物理数据库连接来满足 系统需求。通过连接池技术Java应用程序不仅可以提高系统性能同时也为系统提高了可测量性。

数据库连接池是运行在后台的而且应用程序的编码没有任何的影响。此中状况存在的前提是应用程序必须通过DataSource对象(一个实现 javaxsqlDataSource接口的实例)的方式代替原有通过DriverManager类来获得数据库连接的方式。一个实现 javaxsqlDataSource接口的类可以支持也可以不支持数据库连接池,但是两者获得数据库连接的代码基本是相同的。

一个DataSource对象通常注册在JNDI命名服务上,应用程序可以通过标准的方式获得到注册在JNDI服务上的DataSource对象。 代码如下:

Context ctx = new InitialContext();

DataSource ds = (DataSource) ctxlookup("jdbc/openbase");

如果当前DataSource不支持数据库连接池,应用程序将获得一个和物理数据库连接对应的Connection对象。而如果当前的 DataSource对象支持数据库连接池,应用程序自动获得重用的数据库连接而不用创建新的数据库连接。重用的数据库连接和新建立连接的数据库连接使用 上没有任何不同。应用程序可以通过重用的连接正常的访问数据库,进行访问数据的 *** 作,完成 *** 作后应显式的调用close()关闭数据库连接。

Connection con = dsgetConnection("User", "Pwd");

相关数据库的 *** 作;

conclose();

当关闭数据连接后,当前使用的数据库连接将不会被物理关闭,而是放回到数据库连接池中进行重用。

JDBC30规范中数据库连接池框架

JDBC30规范中通过提供了一个支持数据库连接池的框架,这个框架仅仅规定了如何支持连接池的实现,而连接池的具体实现JDBC 30规范并没有做相关的规定。通过这个框架可以让不同角色的开发人员共同实现数据库连接池。

通过JDBC30规范可以知道具体数据库连接池的实现可以分为JDBC Driver级和Application Server级。在JDBC Driver级的实现中任何相关的工作均由特定数据库厂商的JDBC Drvier的开发人员来具体实现,即JDBC Driver既需要提供对数据库连接池的支持同时也必须对数据库连接池进行具体实现。而在Application Server级中数据库连接池的实现中特定数据库厂商的JDBC Driver开发人员和Application Server开发人员来共同实现数据库连接池的实现(但是现在大多数Application Server厂商实现的连接池的机制和规范中提到有差异),其中特定数据库厂商的JDBC Driver提供数据库连接池的支持而特定的Application Server厂商提供数据库连接池的具体实现。

JDBC30规范规定了如下的类和接口来支持数据库连接池的实现。

javaxsqlConnectionEvent

javaxsqlConnectionPoolDataSource

javaxsqlPooledConnection

javaxsqlConnectionEventListener

其中除javaxsqlConnectionEvent是类,其它的均为接口。

C:/1jpg

screenwidth-333)thiswidth=screenwidth-333;" src="/Develop/ArticleImages/19/19446/CSDN_Dev_Image_2003-7-41948411jpg">

JDBC30连接池框架的关系图

通过此图可以大概的了解相关接口在一个典型的三层环境中应用程序的位置。

数据库连接池实现层次中,由特定数据库厂商的JDBC Driver开发人员提供连接池支持,而特定Application Server提供连接池实现的情况比较复杂,其它的实现层次均可视为其简化情况的一种。下面将针对这种情况进行说明。

在这个框架主要有两个用户角色存在,它们分别是:

特定数据库厂商的JDBC Driver开发人员,之后将简称为Driver Vendor

特定Application Server中连接池开发人员,之后将简称为Pooling Vendor

C:/2bmp

screenwidth-333)thiswidth=screenwidth-333;" src="/Develop/ArticleImages/19/19446/CSDN_Dev_Image_2003-7-41948413gif">

JDBC30规范中在上述情况下各个接口和类之间的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 30连接池实现框架中PooledConnection对象扮演的角色可以视为产生Connection对象的工厂。

Pooling Vendor DataSource:

Pooling Vendor必须实现DataSource接口,这个接口是和连接池实现模块进行交互的入口点。ConnectionPoolDataSource根据需要创建PooledConnection对象。

Pooling Vendor Connection Cache:

此模块是Pooling Vendor对连接池的具体实现。JDBC 30 规范没有规定在DataSource对象和数据库连接池实现之间的需要实现的接口,所以它们之间的交互由Pooling Vendor自己定义。一般而言,一个数据库连接池的具体实现包含了一个或若干个具体的类,但是在连接池实现模块中必须包含一个类实现标准 ConnectionEventListener接口。当一个PooledConnectiond对象被关闭或者出现异常的时 候,PooledConnection对象将会向ConnectionEventListener接口发送ConnectionEvent对象,连接池实 现模块将会根据返回的ConnectionEvent对象对PooledConnection进行关闭或者重用 *** 作。

ConnectionEvent:

实现连接池时,当应用程序调用Connectionclose()试图去关闭数据库连接时,这时需要有一个通告给连接池实现模块,通告对当前的数据 库物理连接(PooledConnection 对象)进行重用。为了使连接池实现模块能得到这种"通告",连接池实现模块必须实现ConnectionEventListener接口,而且同时需要注 册成为PooledConnection对象的监听者。连接池实现模块通过 PooledConnectionaddConnectionEventListener()方法注册自己成为一个监听者。

在典型三层环境中具体调用流程:

当应用程序通过调用DataSourcegetConnection()得到一个数据库连接。

Pooling Vendor实现的DataSource对象在连接池中进行查找看当前是否有有效的PooledConnection对象,如果连接池中有可用的PooledConnection,则进行检查,如果当前的PooledConnection可用则使用。

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

然后,Pooling Vendor会调用PooledConnectiongetConnection()获得一个逻辑的Connection对象,这个逻辑的 Connection对象将会象正常的Connection对象返回给应用程序。这个逻辑Connection对象实际上是连接池中 PooledConnection对象的一个句柄,当连接池有效时,应用程序调用DataSourcegetConnection()就会得到这个句 柄。简而言之,应用程序此时使用的Connection对象仅仅是其创建者PooledConnection对象的句柄而已。

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

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

LoginValidatecs//验证用户登录的方法的类 private static string SqlConnection connection = new SqlConnection(connectionString);//connectionString自己写public bool GetPassWordByUserName(string UserName,string Password)

{ try

{

string truePass = null; connectionOpen(); SqlCommand command = new SqlCommand(); commandCommandText=StringFormat("select password from UserInfo where userName={0}",UserName); SqlDataReader reader = commandExecuteReader(); while(readerRead())

{

truePass =readerRead["Password"]ToString();

}

}

catch

{}

finally

{

readerClose();connectionClose();

}

if( (truePass==null) || (Password != truePass))

//用户名不存在或密码不正确

else

//密码正确

}}

//其实C#这个登录验证的还是比较简单的,实现这个功能有很多种,我只是简单的写了下,你可以用三层架构来实现

Android 和 Maemo 的主要吸引力,可能都在于软件的自由度。但是对于我们这些自由软件用户和开发者,更应该支持哪个呢?现实中的软件自由度有多个层面的含义。尽管理论上只需要一个合适的授权方式,但我们需要考虑很多的东西,例如最简单的就是给终端使用者管理员级别的权限。以下四点在我看来至关重要: 1 用户的访问权限 2 协作和交互的程度 3 闭源软件的存在 4 实际应用中的自由度用户访问权限对于手机来说,完全控制你自己的设备从来都不是理所当然的事情。现在市面上的很多平台确实允许用户运行他们的自制程序,但往往针对恶意软件的安全策略也会影响自制软件。 更让人困惑的是,由于传统手机 *** 作系统功能先天不足,这样的能力是否有用还需要商酌(指运行自制软件)。目前更加强大的硬件使得手机可以在不影响续航能力的前提下运行Linux,但作为用户应当有更高的期待。Android 和 Maemo 都可以宣称自己的核心组件是免费的,但是到目前为止我们只讨论用户权限。对于Android 阵营来说很遗憾,目前没有厂商在自家手机里主动提供获取 Root 权限的方式。因此,尽管不像 iPhone 越狱那么困难,Android 的用户仍然需要八仙过海、各显神通来获取系统的最高权限。而直接由 Nokia 研发的 Maemo 则会在系统里直接内置获取 Root 权限的方式,用户只需要从官方软件源安装一个包,这个包的作用仅仅是让用户理解开启 Root 权限的危险性。(注:稍微解释下几个名词,所谓的 Root 权限就是管理员权限,事实上用这个权限运行应用软件非常危险,因为它完全不受系统安全策略的影响,你很可能在不知不觉中干掉自己的系统,软件源是源自 Debian 的说法,你可以把它理解为更加强大的 App store。)如果在 Android 设备上也可以很容易地通过非官方途径获得 Root 权限的话,会出现怎样的问题?以下列举几个:初学者压根就不会动这种念头。专业知识不应该成为自由之路上的绊脚石,谁说初学者一定不会用到 Root 权限? 高级用户不该为了获取 Root 权限而被迫破解手机。有些人破解完了以后会有负罪感,但事实上他们只不过是买了一个倒霉的残疾产品。用户不应该被迫和 *** 作系统斗争,在破解手机会让他们失去厂商的安全升级。一个需要破解的 *** 作系统是劣质产品,即便它的用户可以通过非官方的手段获得完全控制设备的自由。 软件市场将会被分为已破解和未破解两类。破解手机的用户并不一定能够获得未来的产品更新和服务。 胜者: 跑在 Nokia 设备上的 Maemo。 协作和交互我们可以开发最迷人的文字编辑工具,但是如果这个软件只能运行在任天堂模拟器上的话,那这东西就几乎没有任何用处。这不是这个编辑器的错误,我们也不会得到更多的协助,在这种情况下,作者都不一定会有热情来推销这么个软件。这就是为什么有时候不能仅仅用 GPL 发布完一个软件就完事了。 在这里我们不准备讨论协作对个人的意义,但我们仍然能看到哪个平台在这方面处于领先地位。 Maemo 是 Debian GNU/Linux 的一个简化版本,它拥有一个在标准 X11 服务上运行的为移动设备优化过的窗口管理器。这意味着 Maemo 的代码实际上可以非常容易地与任何 Unix 类型的自由 *** 作系统共享。(注:这点非常重要,如果 Nokia 能够提供方便易用的转换工具的话,Maemo 可以轻松拥有数万桌面级软件的庞大软件阵容。)这里说一个实际上的例子,Nokia 为了方便创建对移动设备友好的软件而开发的 Hildon 工具已经被 Gnome 接受,并被用在 Ubuntu 移动互联网设备专用版本的开发上。 2010-1-11 00:52 回复 中国福特宝 2楼Android 运行在 Linux 内核上,但是它的应用程序事实上是跑在 Google 自己开发的 Java 虚拟机上。尽管 Google 已经发布了原生的 SDK,但很遗憾,这个 SDK 只允许部分对性能要求极高的软件运行在原生态上。总而言之, Android 根本就不像个跑 Linux 内核的系统,开发者事实上也只能使用非标准的 Java 进行开发。有迹象表明 Google 这么做是刻意为之,目的就是限制软件的能力而迫使用户使

先取得登录页面的用户名跟密码! 再用SQL语句进行查询!

select form 表名 where 数据库中的用户名字段=取得登录页面的用户名

select form 表名 where 数据库中的密码字段=取得登录页面的密码

再把这两个SQL语句传过去! 用COMMAND的ExecuteNonQuery方法执行!得到一个数!再进行判断

具体解决方法如下:

1、对象未定义时将产生此类错误:

一种典型的情况就是在定义对象时未正确创建对象本身而导致在编译时产生“用户定义类型未定义”的错误提示。

对此提供以下通用定义外部对象的方法:

Sub 定义并引用外部对象()    'Word后期绑定示例

  Dim wdapp As Object

  Dim wd As Object

  Dim tb As Object

  Set wdapp = CreateObject("wordapplication")   '打开一个word运用环境

  wdappVisible = True   '允许word文件可见

  Set wd = wdappDocumentsAdd    '新建一个word文档

  Set tb = wdTablesAdd(wdRange(0, 0), 3, 6)

  '在文档开始处加入一个3行6列的表格!!

End Sub

2、未引用相关库文件导致产生此类错误:尤其是在代码中引用了相关控件的方法,但是之前并未引用对应的库函数将导致这类错误。对此我们需要首先加入对控制的支持库,然后方可在编辑中引用对应控件。

引用对应支持库的方法:在VBA环境下,点击“工具"->”引用 “项。

3、然后在打开的”引用“窗口中,勾选相应的项,点击”确定“即可完成支持库的导入 *** 作。

4、另外针对变量,Excel VBA采取了两种对待方式,一种是弱定义,即允许变量在未定义的情况下直接使用。另一种则是强定义,即变量必须得先声明后使用。如果想要在两种定义之间切换,可以使用关键字“Option Explicit”进入强定义声明。这样就不会产生“变量未定义”的错误提示啦。

以上就是关于用DriverManager和DataSource获得Connection的区别在哪全部的内容,包括:用DriverManager和DataSource获得Connection的区别在哪、在C#中如何能实现用户登录(用户信息存放在数据库中)、如何通过ADO获得Access数据库中的所有用户表和表信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10150294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存