金华网站建设,金华网络公司,金华网站设计制作,个人网站制作

金华网站建设

首页 > Asp.Net > Asp.net Access OleDb 连接池 原理说明

Asp.net Access OleDb 连接池 原理说明

2008-9-3 12:28:35

现在用Asp.net做普通企业一般都用Access,Sql Server等其它数据没必要用,一般企业信息量不大,过万的信息量的普通企业站几乎没有,每天的独立ip超三百就不错了,这是使用Access完成可以承受的,但用Asp.net Access开发网站时,即使在本地浏览,也会有明显的停顿现象,即使客户说没有关系,可做为一个程序员,发现自己写的程序在本地浏览都可以用肉眼看出停顿(甚至比asp明显慢一拍),那就很不爽,下面就是解决该问题.
使用连接池就可以解决此问题,但OleDb+Access 并没有自带的连接池功能(现在没有发现有自带连接池的),下面将介绍怎样用程序的方式,自己开发一个连接池,原理与Sql Server等差不多.

连接池是高性能,可伸缩应用程序的一个重要特征,Access用OleDb服务实现数据库连接做网站,没有程序池的概念,所以以往用asp+access编程时,浏览一个网页,基本上都是一次将Connection对象打开然后在页尾调用Close()关闭连接.而在Asp.Net时,都是使用
cmd.ExecuteReader(CommandBehavior.CloseConnection);

try
{
 DataTable dt = new DataTable();
                ........
                OleDbDataAdapter da = new OleDbDataAdapter(cmd);
                da.Fill(dt);
                return dt;
}
catch (Exception ex)
{
                conn.Close();
                throw ex;
}
finally
{
                conn.Close();
}

这样做倒置的结果是,假设你在首页读取5条新闻,然后又读成一个公告、产品类别、最新产品、友情链接 等等,注意这里的每一项数据的开读取和读取完成都会调用Connection的Open()和Close(),如果用Access OleDb连接话,这样的重复关闭和打开Connection,会很慢,超过五六次在本地测试时明显有停顿,因为把一个全新的连接对象代价很高,那为什么Sql Server ,Oracle不会出现这样的问题呢?因为Sql Server和Oracle提供程序的连接池自动启用.

即连接通过调用诸如Close()或Dispose等方法释放到连接池,用Access OleDb做连接池也是这个原理,在把连接对象释放到连接池时,并没有真正的Close()或Dispose(),而是用一个时间机制(Timer)缓个几秒或更长的时间,再显示的关闭连接,否则连接可能不会返回到连接池,除非连接池达到了最大连接数并且连接仍然有效.

为了使连接池有效地起作用,昼使用连接对象返回到连接池中非常重要的.

在Sql Server 中,用以下方法比较好,类似上面.
SqlConnection conn=new SqlConnection(connString)
try
{
 conn.Open();
 .....
}
catch()
{....}
finally
{
 conn.Close();
}
也可以用
using(SqlConnection conn=new SqlConnection(connString))
{
conn.Open();
.......
}

注意:为了避免泄露连接,需要保证只有在事务完成时才关闭或处置连接(即把连接返回到连接池的过程),而且最好在完成后马上进行.
另外:using语句相关于上述的try/catch/finally块,它在finally城中调用Close()或Dispose方法.我们可以即调用Close(),或Dispose(),甚至还可以同时调用他们.他们的作用相同,Dispose()清除连接字符串,并调用Close(),一般情况下,调用数据连接时失败,抛出异常时,Close()不会被调用,连接不会返回到连接池,用using可以达到此目的,因为它确保连接对象被使用时总是调用Dispose().不过也可以在try/catch/finall中catch(){在此可以调用连接对象Close()方法}

在服务器上,有多个数据库时使用连接池效果很好,因为每个连接池都与一个不同的连接字符串(即可以理解为类似的"Provider=SQLOLEDB;DataSource=(local);uid=sa;pwd=admin;Initial Catalog=...")关联,打开一个新的连接时,如果连接字符串不是正好与一个已有的连接池匹配,则创建一个新的连接池,一但创建连接池,就只能在进程结束时释放.这样做不会影响系统性能,因为维护非活动的或空的连接池所需要的开销非常低.

当一个连接对象被请求时,只要连接池中有一个可用的连接,就从该池中获取.一个可用的连接必须是当前未使用的,有一个匹配的事务上下文或者没有上下文,并且与服务器有一个有效的连接.如果没有可用的连接,连接池程序将当试创建一个连接对象.达到最大的连接池大小时,请入队列时,并且一有连接对象被释放到连接池中就用它来服务该请求.

 

阅读:278次  评论:0次 来自:本站原创 
上一篇:网站优化与Javascript 下一篇:Google浏览器,Google推出Chrome浏览器
相关文章
网友评论
昵称:
内容: <2000字
验证码:
 

搜索


分类
最新文章
最近评论
最新留言
统计
文章: 40 篇
评论: 3 个
留言: 2 个
访问: 50914 次

我的博客

金华网站制作为您提供服务

QQ:602531943

链接
Tags

Copyright © 2008 金华网站建设为您提供网站制作,网页设计,基于SEO网站优化服务
Rss