ITPub博客

分享解决SQL数据库超时(timeout)的问题可能原因

原创 作者:kitesky 时间:2010-12-17 14:40:28 0 删除 编辑
1.由于数据库设计问题造成SQL数据库新增数据时超时

症状:

Microsoft OLE DB Provider
for SQL Server 错误 '80040e31'[ODBC SQL Server Driver]
超时已过期);
服务器上看CPU、内存占用率很低;
事件日志中提示: 数据库
'*********' 中文件 '***********' 的自动增长在 453 毫秒后已取消或出现超时。使用 ALTER DATABASE
设置更小的 FILEGROWTH 或设置新的大小。
原因:
数据库设置时,
[文件增长]
按百分比来增长,当数据库文件很大时(1G以上),新增操作都会报超时,而这时候其实CPU、内存占用率都非常非常的低。

解决方法:
把上述的文件增长这里设置为一个更低的百分比或者直接指定增加多少兆字节。
2
.SQL Server数据库超时设置

修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是
4 秒,而查询分析器是 15
秒。

企业管理器中的设置:

在企业管理器中,选择菜单上的"工具",再选择"选项";
在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;
在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如
30

查询分析器中的设置:
单击“工具”
->"选项"->
"连接"; 将登录超时设置为一个较大的数字,连接超时改为0。
3
.查询语句时超时

原因分析:
查询超时一般来说首先要从sql语句和数据表的结构上找原因,优化sql语句和为数据库的查询字段建索引是最常用的办法。
另外,数据库的查询超时设置一般是sqlserver自己维护的(在你没有修改query wait配置前),只有当你的实际查询时间超过估计查询时间的25倍时,才会超时。

而造成超出估计值那么多的原因有两种可能:

估计时间不准确;
sql语句涉及到大量占用内存的查询(如排序和哈希操作),内存不够,需要排队等待资源造成的。
解决办法:

优化语句,创建使用合适的索引;
解决第一个问题的方法,更新要查询表的索引分发统计,保证估计时间的正确性,
UPDATE STATISTICS
表名;
增加内存
如果想手动设置查询超时,可以使用以下语句:
sp_configure
'show advanced options', 1 GO RECONFIGURE GO sp_configure 'query wait', 2147483647 GO RECONFIGURE GO

4.应用程序连接失败

故障:
在应用程序中我们也会遇到类似的错误信息,例如:
Microsoft OLE DB Provider
for ODBC Drivers 错误 '80004005'. [Microsoft][ODBC SQL Server Driver]
超时已过期.

解决方法:
A.如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
%Set Conn = Server.CreateObject("ADODB.Connection")DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER;PWD=password;DATABASE=mydatabase"Conn. Properties("Connect Timeout") = 15 '
以秒为单位Conn.open DSNtest%>

B.  如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:
Dim cn As New ADODB.ConnectionDim rs As ADODB.Recordset. . . cmd1 = txtQuery.TextSet rs = New ADODB.Recordsetrs.Properties("Command Time Out") = 300
'同样以秒为单位,如果设置为 0 表示无限制rs.Open
cmd1, cnrs.MoveFirst. . .
[@more@]
上一篇: DBCC TRACEON (3604)
请登录后发表评论 登录
全部评论

注册时间:2009-04-22

  • 博文量
    272
  • 访问量
    2161604