`
pcajax
  • 浏览: 2106384 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

利用对象池优化数据库操作

阅读更多

 

 

简介:这是利用对象池优化数据库操作的详细页面,介绍了和asp.net,.Net,创建,对象池,示例有关的知识,要查看更多相关信息,请点击此处

说到对象池,大家都不陌生。很多人都实现过,网上的代码也满天飞。说到连接池,更是谁人不知,哪家不晓。也有不少人自己实现了连接池,试图对数据访问进行优化。归纳了一下,比较常见的思路如下:

<!--[if !supportLists]-->1.                   <!--[endif]-->数据库连接的打开比较耗费资源,如果能避免重复的开关,可以提高效率。

<!--[if !supportLists]-->2.                   <!--[endif]-->如果有一个一直打开数据库连接,直到程序结束其生命才随之结束。长时间打开并重复使用将导致连接对象的不稳定。

<!--[if !supportLists]-->3.                   <!--[endif]-->无法保证打开的连接一点问题都不出。

<!--[if !supportLists]-->4.                   <!--[endif]-->自动化管理数据库连接,解决频繁创建、分配、释放带来的问题

然而本人认为,这些担心相对来说并不是首要的。微软在.net Framework平台下既然推荐使用断开模式,按照微软的作风,必然有一个适当的解决方案来。首先Ado.net本身实现了连接池,自动管理数据库连接的生命周期(虽然如果不加控制,随意打开连接,也会有池被填满的时候),其次Ado.net的连接池也解决了数据库连接反复打开的效率问题。本人认为:虽然常见的连接池都以控制连接的实例数为目标,但池中的元素其实是共享的,也无法控制并发的操作数,并不见得就能为性能带来什么本质的提高。在数据库操作中有一个更重要的东西:控制同一时间的并发操作数。

首先,来看看Ado.net的工作方式。Ado.net在数据访问上提供了2种方式:1、连接模式:一般采用DbDataReader对数据进行读取,读取的过程中,数据库连接始终是打开的。在读取数据前,打开数据库连接。读取结束后在关闭数据库连接。2、断开模式:利用DbDataAdapter将数据一次性取出,填充到DataSet中,然后关闭数据库连接,DataSet中的数据和数据库是完全断开的。由DbDataAdpater在是获取数据前,判断数据库连接是否打开,如果处于关闭状态,则将连接打开,填充完DataSet之后,再将数据库连接关闭。如果连接在获取数据之前已经打开,则不打开连接,填充完DataSet后也不将连接关闭。因此Ado.net的工作方式可以归纳为以下程:1、打开连接。2、执行SQL语句返回结果。3、关闭连接。可以说这3个步骤组成了.net下数据操作的标准模式。虽然数据操作只是在重复这3个 基本步骤,但是在单线程和多线程的应用场合下实现的细节也有所不同。单线程应用开发时,常用的做法是整个应用程序共享一个数据库连接;由于一个应用程序 中,用户同一时间只能进行一次数据库操作,因此这种方法是可行的。而进行多线程应用开发时,由于是多线程并发操作数据库,因此每次数据库操作都实例化一个 数据库连接,然后再执行标准的3个步骤。

从Ado.net的工作方式不难看出,如果同时进行的多个数据操作,共享一个数据库连接,是绝对不允许的。虽然Ado.net提供了MARS(即:Multiple Active Result Sets)来解决这个问题,在数据库连接字符串中加入“MultipleActiveResultSets=true”。但并不是所有数据库都支持MARS,常用的Sql server2000数据库就是一个例子,而且启用MARS会大大降低系统的性能。因此当数据库不支持MARS时或出于性能上的考虑又或者不是读取而是进行写操作,最常用的做法就是每一个数据操作都实例化一个数据库连接。

然 而,看似合理的做法又引来了新的问题。首先服务器资源是有限的,每次数据操作都实例化一个连接都会占用服务器资源,特别是在长时间的数据存取操作上。如果 实例化并打开了一个数据连接,但忘记关闭,将占用服务器的连接直到垃圾回收机制自动回收的时候才会释放当前占用的连接,容易造成所谓的连接泄露。其次,客 户端进行异步调用的时候往往无法预测并发的数量,无限制发起异步操作并同时进行将导致服务器超负荷工作,不仅没有起到优化的作用,还带来了更多负面的影响 (如:连接超时、响应变慢、内存不足等一些列问题)。

通过简单的测试可以得到一下结果:即使SQL语句执行时间较短,同时进行大量的并发数据库操作,但不加控制,服务器基本就当机了。当SQL语句执行时间较长时,可能希望利用并发的异步操作来优化效率,如果不加控制,实际结果往往是连接超时的几率大大增加,却不见得能带来更高的效率。或者说一个客户端开始发飙后,其他的客户端基本就无法连上了。

总结起来,必须用一个比较合理的手段来控制实例化的连接数,同时又能控制并发的数据库操作数。实现一个对象池,池中的元素都是以独占方式取出。池的策略分为2种:1、速度优先:只要有空闲的元素就直接使用。2、使用次数优先:在已使用的元素中选择使用次数最少的。从池中获取可用的数据库连接时,首先判断是否有已初始化的空闲连接,其次判断是否还有空位能容纳新的连接。如果前二者都无法满足,则进入等待并利用Sleep暂 停当前线程,直到有元素空闲。在对象池初始化的同时,启动一个轮询线程,用于定时对对象池进行执行清理工作,如:在作为连接池时可以关闭超时的连接,释放 未使用的连接。具体使用时,只要简单将原来实例化一个DbConnection改为从池中获取一个可用的连接。并在使用完成之后将连接归还给池。由于池中 的每个元素都是独占的,当池中没有空闲的元素时就必须等待,直到有空闲的元素出现。因此,设置合适的池大小,在一定程度上等于限制了并发的操作数。

恰当地使用对象池技术,能有效地改善应用程序的性能。目前,对象池技术已得到广泛的应用(如:对于Web、网络和数据库等,一般都会采用对象池技术),但不应滥用。Ado.net本身实现了连接池,并为我们提供了一个高效、健壮的机制。在Ado.net开发时应该将主要的精力放在如何控制并发的数量和优化SQL语句上以及事务的处理上。

最后,丢一个土了吧唧的对象池工作流程图,让人批斗^_^ 。

.Net,创建,对象池,示例

分享到:
评论

相关推荐

    数据库系统原理课程设计——图书管理

    数据库设计是指对于一个给定的应用环境,构造优化的数据库逻辑模式和物理模式结果,并据此建立数据库及其应用系统,使之能有效地存储和管理数据,满足应用需求,包括信息管理要求和数据操作。信息管理要求是指在...

    浅谈数据库系统优化.docx

    所谓基于代价的优化器是指,系统根据目前数据库的信息,对数据库的查询及操作的开资做一个判断,然后选出一个开资相对较小的优化方案。这种优化器主要是根据数据库相关的服务器的因素来进行分配处理的,包括缓存大小...

    数据库优化设计方案.doc

    优化自由结 构,简单地讲就是在数据库中可以高效自由地分布逻辑数据对象,因此首先要对数据库 中的逻辑对象根据他们的使用方式和物理结构对数据库的影响来进行分类,这种分类包 括将系统数据和用户数据分开、一般...

    分布式数据库试题及答案.doc

    5.1.3. 利用左深树、右深树、浓密树来进行查询优化的各自特点 29 5.1.4. 试解释影响并行数据库系统中并行算法性能的三个因数 30 5.1.5. 简述用爬山算法进行查询优化的基本思想 30 5.2. 下面是某个公司一个人事关系...

    WEB数据库中几种数据库连接方法比较

    随着数据库技术在Interne t中的广泛应用, 数据库技术已经成为网络的核心技术. 网站和数据库的连 接方法有很多种, 本文介绍了利用OLE DB、ODBC连接W eb数据源的两...的优缺点, 最后介绍了用连接池技术来优化访问数据库.

    Oracle 数据库优化实战心得总结

    优化sql语句 1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。 2)尽量使用相同的或非常类似的SQL语句进行查询,这样不仅充分利用SQL共享池中...

    数据库学习基础之名词解释

    在数据库画板中可以显示数据库中的所有数据表(即使不是用PowerBuilder创建的表),创建数据表,修改表的定义等数据表是数据库中一个非常重要的对象,是其他对象的基础。没有数据表,关键字、主键、索引等也就...

    Oracle数据库管理员技术指南

    1.6.1 利用 Oracle 安装程序创建数据库 1.6.2 使用安装程序创建数据库的注意 事项 1.6.3 怎样建立自己的定制数据库创建 脚本 1.6.4 如何从已有数据库克隆数据库 1.6.5 怎样利用 Database Configuration ...

    教学管理系统 数据库课程设计

    ……本系统选择了使用MS SQLServer 2000数据库和Borland公司的Delphi 7.0为开发工具, Delphi7.0是比较完备的面向数据库开发工具,同时它也利用其提供的各种面向对象的开发工具,尤其是DBGID数据窗口这一能方便而简洁...

    JDBC数据库的使用操作总结

    由于传统的数据库操作方式需要程序员掌握各个不同的数据库的API,极其不便 因此java定义了JDBC这一标准的接口和类,为程序员操作数据库提供了统一的方式 JDBC的操作方式比较单一,由五个流程组成:1.通过数据库厂商...

    C++利用MySQL API连接和操作数据库实例详解

    C++利用MySQL API连接和操作数据库实例详解 在Windows平台,我们可以使用ADO、ODBC或者MySQL API进行连接和操作。ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的一个用于存取数据源的COM组件。它...

    数据库设计准则及方法论.docx

    方法三:合理设计存储 方法四:优化数据库参数,减少资源竞争 优化配置数据库的参数,包括各种缓存池的大小,内存区的配置,刷新脏页的策略,锁的策略等。虽然各个数据库都不相同,但是所有的出发点都是为了通过...

    数据库课程设计(图书管理系统).doc

    数据 库设计是指对于一个给定的应用环境,构造优化的数据库逻辑模式和物理模式结果,并 据此建立数据库及其应用系统,使之能有效地存储和管理数据,满足应用需求,包括信 息管理要求和数据操作。信息管理要求是指在...

    网上购物系统数据库设计.doc

    由于数据库应用系统的复杂性,为了支持相关程序运行,数据库设计就变得异常复杂, 因此最佳设计不可能一蹴而就,而只能是一种"反复探寻,逐步求精"的过程,也就是规 划和结构化数据库中的数据对象以及这些数据对象...

    数据库设计工具.docx

    它能够与许多流行的数据库设计软件,例如PowerBuilder,Delphi,VB等相配合使缩短开发时刻和使系统设计更优化。power designer是能进行数据库设计的壮大的软件,是一款开发人员经常使用的数据库建模工具。 数据库...

    云数据库方案设计.docx

    数据库访问大数据计算平台 大数据计算平台可以将数据,例如计算结果,写入到数据库中,再在数据库中,利用SQL对数据进行分析。 云数据集成 3.1 与RDS的数据集成 数据库使用外部表技术,可以访问RDS中的其他数据。 ...

    数据库系统的核心.doc

    数据库系统的核心 数据库系统(Database System),是由数据库及其管理软件组成的系统。... 数据库的安全策略 第一,系统安全策略:包括了数据库用户管理、数据库操作规范、用户认证、操作系 统安全4个部分。 1)数

    数据库安全性设计.doc

    数据库安全 1 现状 现在信息系统的开发中数据库的设计所在比重越来越大,防止数据库不被非法访问、 破坏和提高数据库的性能是数据库设计非常重要的环节,数据库安全性设计和性能优化 已被广大系统开发者所重视。...

Global site tag (gtag.js) - Google Analytics