`
pcajax
  • 浏览: 2183902 次
  • 性别: 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,创建,对象池,示例

分享到:
评论

相关推荐

    对象池&线程池&数据库连接池

    例如,JDBC的`Statement`和`PreparedStatement`对象池,可以减少数据库操作的开销。 2. **线程池**: 线程池是另一种资源复用机制,它维护了一组可重用的线程。当需要执行任务时,线程池会从池中取出一个空闲线程...

    简单版连接池操作数据库增删改(适合新手学习)

    在IT行业中,数据库操作是必不可少的一部分,而连接池则是优化数据库访问效率的重要工具。本教程“简单版连接池操作数据库增删改”旨在帮助新手掌握如何利用连接池进行数据库的基本操作,包括插入(Insert)、删除...

    利用ASP实现Web数据库的访问

    - **优化数据库连接**:合理管理`Connection`对象的生命周期,避免频繁地打开和关闭连接。 - **缓存查询结果**:对于经常被访问的数据,可以考虑使用缓存机制存储查询结果,减少对数据库的直接访问次数。 - **精简...

    C#源码 访问ACCESS数据库 通过反射调用命令 清理数据库 执行数据库优化 压缩操作

    在数据库操作中,反射可以用来动态执行未知或在编译时不确定的数据库命令。 **数据库清理** 数据库清理通常涉及删除不再需要的数据,如日志、临时表或旧记录。在C#中,可以通过构造SQL删除语句并使用Command对象...

    批量读取excel文件并利用dbcp连接池写入数据库

    本话题主要涉及如何批量读取Excel文件,并利用DBCP连接池将数据写入数据库。这个过程涉及到几个关键知识点,包括Excel文件操作、数据库连接池的使用以及多线程处理。 首先,Excel文件操作通常使用Java中的Apache ...

    易语言数据库操作演示源码

    总的来说,这份易语言数据库操作的演示源码将展示如何利用易语言的数据库接口进行数据库连接、SQL执行、数据读写、事务管理和错误处理等核心功能。通过学习这些源码,开发者可以快速掌握易语言在数据库操作上的技巧...

    C++对象池源码示例

    在数据库连接池中,预先创建并保持一定数量的数据库连接,当需要时快速分配,不需要时回收,以提高数据库操作的性能。 总的来说,C++对象池是一种优化技术,它通过集中管理对象的生命周期,减少了内存分配和释放的...

    面向对象数据库系统讲义

    本讲义可能包含实际案例,例如如何设计和实现一个基于面向对象数据库的图形设计系统,或者在生物信息学中如何利用面向对象数据库来存储和检索基因序列数据。 通过学习这门课程,读者将能够理解和运用面向对象数据库...

    数据库优化,代码优化数据库

    数据库是存储和管理数据的核心组件,优化数据库可以显著提高数据检索的速度,降低服务器负载。常见的数据库优化策略包括: 1. **索引优化**:为经常用于查询的字段创建索引,可以加快数据查找的速度。但是,过多的...

    C#高效数据库连接池源码

    数据库连接池是数据库管理中的重要概念,特别是在高并发和大数据量的应用场景下,它能显著提升性能并降低...通过分析提供的源码,开发者可以学习到如何在C#环境中有效地管理和优化数据库连接,提升系统整体的运行效率。

    C# 数据库连接池实例

    数据库连接池是数据库管理中的一个重要概念,特别是在使用像C#这样的编程语言进行数据库操作时,它的存在极大地提高了数据库操作的效率和性能。本实例将深入探讨C#中的数据库连接池,以及如何有效地利用它。 首先,...

    云的ADO数据库操作支持库

    8. 版本更新:"云外归鸟的ADO数据库操作支持库121版YunADOfne"可能是该库的一个特定版本,可能包含了性能优化、新特性或修复已知问题的改进。 总的来说,"云的ADO数据库操作支持库"是一个强大的工具,它将传统的ADO...

    数据库连接池相关 jar 包

    数据库连接池在Java开发中扮演着至关重要的角色,它能够有效地管理和优化数据库连接,提高应用程序的性能和资源利用率。在给定的标题和描述中,我们聚焦于两个关键的库——`commons-dbcp.jar`和`commons-pool.jar`,...

    利用JAVA数据库连接池连接数据库的例子.rar

    数据库连接池还提供了其他功能,如连接池的大小控制、连接超时、自动回收等,有助于提升系统的稳定性和资源利用率。 在这个例子中,我们将探讨如何在Java中使用数据库连接池来连接数据库。通常,开发者会使用第三方...

    代理模式之静态代理---数据库连接池对象实现原理

    至于"工具"标签,它表明代理模式和数据库连接池在实际开发中是作为工具类或库来使用的,可以帮助开发者更好地管理和优化数据库访问性能。开发者可以使用这些工具,而无需关心底层实现的复杂性。 总结,代理模式在...

    数据库连接池代码

    数据库连接池是现代Java应用程序中不可或缺的组件,它在提高应用程序性能、管理和优化数据库资源方面起着关键作用。本文将深入探讨基于JDBC的数据库连接池技术,主要针对Oracle数据库,但很多概念同样适用于其他...

    C#的数据库操作例程

    理解连接池的工作原理有助于优化数据库性能。 13. **安全性**: 需要关注SQL注入、权限管理和身份验证等问题,确保应用程序的安全性。 通过学习和实践这些C#数据库操作的例程,你可以掌握如何高效、安全地与各种...

    易语言学习-ADODB数据库操作支持库 (1.4#3版).zip

    8. 并行和异步操作:在多线程或高并发环境下,可以利用ADODB库的特性进行并行或异步数据库操作,提高程序性能。 9. 兼容性:ADODB库不仅适用于易语言,还可以与其他支持COM接口的编程语言配合使用。 学习这个ADODB...

Global site tag (gtag.js) - Google Analytics