您的位置:首页 > 其它

Audit Login 导致死机的原因

2007-10-22 14:11 281 查看
最近客户反应,系统会出现3-5分钟的集体死机情况,用sqlserver跟踪分析器查看,发现一个login out 占用了十几分钟的系统时间。目前还没找到问题的根源,在网上收到一些描述:

在网上找到临时解决方案,在数据库连接串中添加以下内容即可缓解:
Enlist=true;Pooling=true;Max Pool Size=300;Min Pool Size=0;Connection Lifetime=300;packet size=1000

SQL事件探查器中,偶尔出现的audit logout,执行时间更长,要几十秒,有时甚至要几分钟。

是不是这样?

确定真正的原因在于调用ADO连接SQL Server 2000时,发生异常,错误描述就是“[DBMSSOCN]一般性网络错误。请检查网络文档?
为什么会突然出现“[DBMSSOCN]一般性网络错误。”呢?

但是,那是因为网卡或者网线闪断(“network is down”),造成连接数据库失败,服务又不停地试着去连接。不知道在什么情况下,服务不断报告:

可能是因为同一台服务器和SQL Server之间的连接都没有Close,所以导致连接达到被允许的最大数目,从而

你可以通过SQL语句察看当前与SQL Server保持的连接都来自于哪里,有多少个:
这个方法利用ADO.Command:ut_ActiveConnection方法来建立数据库连接的:

有时候,当第N+1(如:2000个)次建立连接的请求被SQL Server 2000认为超出允许范围时,SQL Server 2000会主动将这一千多个的连接同时全部中断。于是乎,在SQL Server事件探查器中,你也可以看到唰地一下所有的Audit Logout事件出来了。

如果测试程序维持着这些数据库连接的话,内存会持续增长

这个有没有问题?

虽然这种情况出现的比较罕见,但是如果排除了网络质量原因,你也许可以注意一下当前服务器与SQL Server的connection数目是否维持在一个正在高涨的数量。

当连接不断增加的时候,就要当心,服务器连接数据库是有一定限制的,而且达到最大值后,其他程序再次请求连接时,就可能得到“一般性网络错误”的警告,而且错误号80004005也并没有说明到底发生了什么,SQL Server和ADO并不会告诉你连接数已经达到最大值

我认为是ADO版本问题,安装正确版本。

你可以通过下面的SQL语句察看当前与SQL Server保持的连接都来自于哪里,有多少个:

你有没有查一查.
如果连接过多.就会自动Audit Logout
于是乎,在SQL Server事件探查器中,你也可以看到唰地一下所有的Audit Logout事件出来了。
这些都会占用内存的呀.

你试验,看看一台服务器被允许与SQL Server建立最多多少个连接。

总之.你先看一看.是不是连接达到一个数字后.全部CLOSE 但还在跟踪从而占用内存.

解决:

如果执行 Audit Logout 说明是ADO连接被断开。

检查 TADOConnection.KeepConnection 属性,如果设置是False,那么当关闭DataSet后
会自动断开连接的。
----------------------------------------------
-
作者:

w_si (w_si)
▲△△△△-
普通会员
2007-7-23 7:43:58
8楼:TADOConnection.KeepConnection 属性是True呀,
谢谢您的关注!
----------------------------------------------
-
作者:

lmaomi (tiger)
▲△△△△-
普通会员
2007-7-23 14:16:25
9楼:那再检查数据集的 CursorType, 当属性为ctOpenForwardOnly、并且ReadOnly情况下性能最佳,执行速度最快。CursorType=ctKeyset 的时候性能最差.
----------------------------------------------
-
作者:

w_si (w_si)
▲△△△△-
普通会员
2007-7-23 15:43:44
10楼:CursorType是用的默认值ctKeyset,以前还真没注意这个属性值的区别,现已改成ctOpenForwardOnly,但还是没解决如上的问题:(
----------------------------------------------
-
作者:

lmaomi (tiger)
▲△△△△-
普通会员
2007-7-23 23:09:43
11楼:如果CursorLocation设置的是server-side cursor,对于 ctOpenForwardOnly,如果有 n个 打开的表,服务器将建立n个隐式的connection! 因为sqlServer一个connection只能有一个打开的ctOpenForwardOnly(default-resultset)Cursor.

当然对于以 ctOpenForwardOnly方式打开的表,操作该表的数据性能是最快的.

如果需要同时打开多个表就改成 ctStatic吧, 或者同一时间只打开一个表.
----------------------------------------------
-
作者:

w_si (w_si)
▲△△△△-
普通会员
2007-7-24 7:23:06
12楼:同一时间只打开一个表是不可能的了,因为查询时得JOIN参数表,改成ctStatic了。
呃,,,但是上面的问题还是没解决 :(

谢谢您一直关注!!
----------------------------------------------
-
作者:

lmaomi (tiger)
▲△△△△-
普通会员
2007-7-24 11:07:32
13楼:不客气,你是用多个简单表(无触发器,无Join)测试的?简单表下还是每次会话都会有 Audit login/logout? 你的connection string是什么?
----------------------------------------------
去掉Use Procedure 试下,另外 SQLOLEDB 后面不要加版本号,这样会强制使用版本1,而不能用新版本:
-- Provider=SQLOLEDB;Password=密码;User ID=用户;Initial Catalog=数据库;Data Source=数据库服务器IP地址;
----------------------------------------------
-
作者:

lmaomi (tiger)
▲△△△△-
普通会员
2007-7-25 19:13:09
18楼:这里有一篇各种连接字符串和数据打开方式的性能测试,可以参考:


http://www.motobit.com/tips/detpg_Perfdata/
忘记问了,既然是SUM 那么ADOQuery的 LockType 属性是否设置的是 ltReadOnly??
----------------------------------------------
-
作者:

w_si (w_si)
▲△△△△-
普通会员
2007-7-28 16:31:00
21楼:lmaomi:
让您问着了,属性还是默认的ltOptimistic,改成ltReadOnly后,不出现Audit Logout和Audit Login。
(adLockReadonly:默认值,只读。无法更改数据。(这是RecodSet的默认值,如果你把锁定的方式设为该值,那么你将不能更新 Recordset。)),用ltOptimistic属性怎么会有这种差别呢?
但SET NO_BROWSETABLE ON与SET NO_BROWSETABLE OFF还是出现了??
----------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: