SQL超时解决方法

发布时间:2018-06-27 15:45:49   来源:文档文库   
字号:

Net 连接池的配置Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.”

ADO.Net 在数据库操作过程中默认打开了连接池,不需要再进行手工配置。这个特性可以使数据库操作时效率提高,但也要有相应的代码配合,才能真正提高程序效率。

1、连接字符串

    ADO.Net 中的连接池大小可以通过数据库连接字符串来控制,例如:

    string cs =

    "server=.;uid=sa;pwd=tcaccp;database=pubs;pooling=true;min pool size=5;max pool size=10"

    其中 pooling 表示是否打开连接池,默认为打开,关掉时需要 pooling = false

    min pool size 表示连接池最少保存几个连接对象;

    max pool size 表示连接池最多保存几个连接对象。(最大值不能为 0,也不能小于最小值)

    配置好以后,通过 SqlConnection con = new SqlConnection(cs); 即可得到一个属于连接池的连接对象。

    但一定要注意,连接字符串的任何改动,系统都会认为是另一个完全不同的数据库连接,将会创建新的连接池,这必然会造成更大的系统开销。所以,为了保证某些连接对象属于一个连接池,连接字符串不能有任何变化,包括大小写,包括空格,都不能有任何变化。   

2、程序中的改动

    普通的数据库操作:

    SqlConnection con = new SqlConnection(cs);

    try

    {

       con.Open();

       //进行各种数据库操作

    }

    catch(Exception ex){ Console.WriteLine(ex.Message); }

    finally

    {

       con.Close();

       con.Dispose();

    }

    这个过程很繁琐,每次都要在操作完毕后保证连接对象的关闭和资源释放。在打开连接池特性以后,finally 中的内容,其实是将连接对象的状态置为关闭,然后放回到连接池中。既然系统知道要放回连接池,那有没有什么更好的方法呢?

    using(SqlConnection con = new SqlConnection(cs))

    {

       try

       {

          con.Open();

          // Do Something......

       }

        catch(Exception ex){ Console.WriteLine(ex.Message); }

    }

    .Net 中的 using 语句,不光能导入命名空间,还能在程序体内,局部使用某个对象。像上边代码,con 的作用域只有 using 对应的大括弧这么大。更神奇的是,using 可以在对象作用域结束时,自动调用 con.Dispose()将对象释放,所以以上代码中,没有 con.Close() con.Dispose(),同样可以释放资源,放回连接池,省了 finally 和手工关闭的麻烦。但同时需要注意,using 既然是在结束作用域时是自动调用对象的 Dispose()方法,那就是说不是什么类型的对象都可以用 using 的方式自动释放,必须要实现 IDispose 接口。

当使用.NET开发数据库应用时,有时会遇到下面的超时异常,Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

现把解决方法总结一下:

影响服务器产生超时的设置大致有:

1. Server.scrīptTimeout,

2. Connection对象的CommandTimeOut属性,

3. Command对象的CommandTimeOut属性,

4. IE浏览器的设置.

Server.scrīptTimeout,默认值是90.

要增大它,在你的asp文件中加一句,如下:

Server.scrīptTimeout=999,

将页面超时设为999.

最初我只设置Server.scrīptTimeout,

但仍会出现timeout错误,无论它的值设成都多大.

后在社区里看到一帖子,提到commandTimeout属性,

于是查看Option Pack文档,果然还有其他的timeout.

Connection对象和Command对象都有个CommandTimeOut属性,

连接字符串中设置了 Connect Timeout只对SqlConnection起作用。

SqlCommand.CommandTimeout

获取或设置在终止执行命令的尝试并生成错误之前的等待时间。

等待命令执行的时间(以秒为单位)。默认为 30 秒。

SqlConnection.ConnectionTimeout

获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。

等待连接打开的时间(以秒为单位)。默认值为 15 秒。

一些更详细的对这个问题的描述看:http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=357

如果你有一个耗时的查询或数据处理,

很容易就超时了.要增大它,也很容易,创建对象后,

设置它的属性,如下:

con.CommandTimeOut = 999,

设为999,其中con是一Connection对象.

如设为零,将无限等待,没有这一timeout限制.

Command对象不会继承Connection的这一属性,

所以对可能超时的Command也要单独设置CommandTimeout属性.

本文来源:https://www.2haoxitong.net/k/doc/6eaf19a10029bd64783e2c85.html

《SQL超时解决方法.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式