当前位置: 首页 > news >正文

Asp.net连接Oracle数据库的连接池问题(ZT)

关键字:ASP.NET, Oracle, 数据库连接池, 性能瓶颈

摘 要:本文通过笔者所经历的一个案例,介绍Asp.net连接Oracle因连接池的问题造成的性能瓶颈的现象,以及解决的办法。

1        问题的发现

2006年下半年,笔者在山东临淄齐鲁石化驻地参与一个项目的开发。公司的另外一个项目《合同管理系统》正处于实施后期阶段。该项目采用.Net开发的B/S架构的系统,使用Oracle做后台数据库。先后两次发现,当在线用户较多的时候,客户端感觉服务系统反应很慢(多数用户报告在登录界面点击登录按钮后,一直处于等待状态,系统不再反应)。查看服务器使用情况,CPU和硬盘访问并不繁忙,内存占用也不是非常大;连接到数据库没有发现死锁,但是会话非常多,大约在110个左右。开始怀疑是数据库的进程(Processes)和会话(Sessions)设置的值较低(未安装时候的默认值,分别为170150)。但是将这两个值扩大以后仍旧未解决问题。在第二次发现该问题的时候,我注意到虽然设置值较低,但是当前并未达到这两个值得上限;同时我也注意到该系统连接数据库的会话正好是100个,由此我联想到数据库连接池。

2        相关资料

查阅过vs.net 2003的帮助之后,在
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.htm,基本内容如下:

使用连接字符串关键字控制连接池

SqlConnection 对象的 ConnectionString 属性支持连接字符串键/值对,这些键/值对可用于调整连接池逻辑的行为。

下表描述了可用于调整连接池行为的 ConnectionString 值。

名称

默认值

说明

Connection Lifetime

0

当连接返回到池中时,将对它的创建时间和当前时间进行比较,如果时间间隔超过由 Connection Lifetime 指定的值(以秒为单位),则会毁坏该连接。在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负载平衡。

如果值为零 (0),则将使池连接具有最大的超时期限。

Connection Reset

'true'

确定在从池中移除数据库连接时是否将其重置。对于 Microsoft SQL Server 版本 7.0,如果设置为 false,将避免在获取连接时经历一个额外的往返过程,但必须注意的是连接状态(如数据库上下文)不会被重置。

Enlist

'true'

当为 true 时,如果存在事务上下文,池管理程序将自动在创建线程的当前事务上下文中登记连接。

Max Pool Size

100

池中允许的最大连接数。

Min Pool Size

0

池中维护的最小连接数。

Pooling

'true'

当为 true 时,将从相应的池中取出连接,或者在必要时创建连接并将其添加到相应的池中。

 

由此可见,ASP.NET连接数据库,数据库连接池默认是开启的,并且池中允许的最大连接数默认为100。由此基本可以确定,访问系统收到的阻碍时由于连接池已满造成的。

该页面中提到,如果连接池中的连接全部占用,系统会在连接池之外开启新的连接。这个说法有疑问,该问题在后面的会体积。

3        问题的确认

为了验证ASP.NET连接Oracle数据库时,连接池中的连接达到最大数,新的连接就需要等待连接池中的连接释放资源,我编写了一个测试页面,在页面装载的时候,首先打开10个连接,然后等待20秒钟后再关闭这些连接。随后使用测试机打开两个测试线程访问该测试页面,然后在浏览器中打开于这个测试页面使用相同连接字串的另外一个页面,发现后者的确需要等待测试线程访问的页面处理完毕之后才可以连接到数据库。

4        问题的解决

找到问题的症结所在,我们系统的连接数据库的字串,增加了Max Pool Size项,根据需要将其设置为200。同时修改了Oracle服务器的的会话(Sessions)和进程(Progresses)的值以满足连接会话的需要。

5        疑问

如前所述,资料中提及,如果连接池的连接全部占用,会创建新的连接。但是在采用默认连接池大小和设置为20个最大连接数的时候,连接池的所有连接全部占用,新的连接请求并没有开启新的连接会话,而是等待连接池中的连接释放。

但是连接池最大连接数设置为200个的时候,该系统的连接曾经一度超过200个上限,达210多个。由此可以判断超出的连接请求在连接池之外创建了新的连接会话,符合了资料中的论述。对此疑问,烦请知情者阐述一下自己的观点。

6        补充

在连接字串修改之后,原有的连接池会重新构建,这一特性是否可以在何种情况下应用?



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1358594

相关文章:

  • 创业者要殷勤巴结的几类人
  • [ACM] hdu 1201 18岁生日
  • prototype.js 1.4版开发者手册
  • 前端日志分析
  • 微信打疼的不只是马云
  • 一个很好的php分词类库
  • 科隆2外挂源代码(VB)
  • Unity3D插件分享
  • MyEclipse 4.1、4.2 GA 破解程序
  • php+jquery+ajax无刷新图片上传裁切,模拟flash头像上传实例
  • MS SQL入门基础:声明游标
  • 4.2 - 《机器学习基石》Home Work 1 Q.18-20
  • 修改SAP系统字段文本
  • 今天我的生日,纪念一下
  • Yii Framework 开发教程(关键是链接)Zii组件-ListView 示例
  • #Java异常处理
  • angular学习第一篇-----环境搭建
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java教程_软件开发基础
  • LeetCode29.两数相除 JavaScript
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • SpringBoot 实战 (三) | 配置文件详解
  • Vue.js源码(2):初探List Rendering
  • 服务器之间,相同帐号,实现免密钥登录
  • 前端面试之CSS3新特性
  • 如何在GitHub上创建个人博客
  • 数据可视化之 Sankey 桑基图的实现
  • %check_box% in rails :coditions={:has_many , :through}
  • (3)nginx 配置(nginx.conf)
  • (70min)字节暑假实习二面(已挂)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (web自动化测试+python)1
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (笔记自用)LeetCode:快乐数
  • (二十六)Java 数据结构
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (转)Sublime Text3配置Lua运行环境
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (总结)(2)编译ORB_SLAM2遇到的错误
  • ..回顾17,展望18
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net Web窗口页属性
  • .net 托管代码与非托管代码
  • .net分布式压力测试工具(Beetle.DT)
  • .NET值类型变量“活”在哪?
  • .sdf和.msp文件读取
  • @component注解的分类
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [001-03-007].第07节:Redis中的事务
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [Android] Upload package to device fails #2720
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [C# 基础知识系列]专题十六:Linq介绍