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 但还在跟踪从而占用内存.
解决:
去掉Use Procedure 试下,另外 SQLOLEDB 后面不要加版本号,这样会强制使用版本1,而不能用新版本:
-- Provider=SQLOLEDB;Password=密码;User ID=用户;Initial Catalog=数据库;Data Source=数据库服务器IP地址;
----------------------------------------------
-
在网上找到临时解决方案,在数据库连接串中添加以下内容即可缓解:
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后 会自动断开连接的。 ---------------------------------------------- - |
作者: |
| 2007-7-23 7:43:58 | ||||
8楼: | TADOConnection.KeepConnection 属性是True呀, 谢谢您的关注! ---------------------------------------------- - |
作者: |
| 2007-7-23 14:16:25 | ||||
9楼: | 那再检查数据集的 CursorType, 当属性为ctOpenForwardOnly、并且ReadOnly情况下性能最佳,执行速度最快。CursorType=ctKeyset 的时候性能最差. ---------------------------------------------- - |
作者: |
| 2007-7-23 15:43:44 | ||||
10楼: | CursorType是用的默认值ctKeyset,以前还真没注意这个属性值的区别,现已改成ctOpenForwardOnly,但还是没解决如上的问题:( ---------------------------------------------- - |
作者: |
| 2007-7-23 23:09:43 | ||||
11楼: | 如果CursorLocation设置的是server-side cursor,对于 ctOpenForwardOnly,如果有 n个 打开的表,服务器将建立n个隐式的connection! 因为sqlServer一个connection只能有一个打开的ctOpenForwardOnly(default-resultset)Cursor. 当然对于以 ctOpenForwardOnly方式打开的表,操作该表的数据性能是最快的. 如果需要同时打开多个表就改成 ctStatic吧, 或者同一时间只打开一个表. ---------------------------------------------- - |
作者: |
| 2007-7-24 7:23:06 | ||||
12楼: | 同一时间只打开一个表是不可能的了,因为查询时得JOIN参数表,改成ctStatic了。 呃,,,但是上面的问题还是没解决 :( 谢谢您一直关注!! ---------------------------------------------- - |
作者: |
| 2007-7-24 11:07:32 | ||||
13楼: | 不客气,你是用多个简单表(无触发器,无Join)测试的?简单表下还是每次会话都会有 Audit login/logout? 你的connection string是什么? ---------------------------------------------- |
-- Provider=SQLOLEDB;Password=密码;User ID=用户;Initial Catalog=数据库;Data Source=数据库服务器IP地址;
----------------------------------------------
-
作者: |
| 2007-7-25 19:13:09 | ||||
18楼: | 这里有一篇各种连接字符串和数据打开方式的性能测试,可以参考:![]() http://www.motobit.com/tips/detpg_Perfdata/ |
忘记问了,既然是SUM 那么ADOQuery的 LockType 属性是否设置的是 ltReadOnly?? ---------------------------------------------- - |
作者: |
| 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还是出现了?? ---------------------------------------------- |
相关文章推荐
- 分析我的OV3640 打开软件立即导致PDA死机的原因
- 导致计算机系统“死机”的原因及其预防方法
- 导致服务器死机的原因集锦
- 提高CPU频率导致死机原因分析
- 【总结】在两个Activity之间进行跳转时出错原因分析(一)——findViewById位置不当导致
- 求救高手,路由器死机原因
- 因为代理原因导致的NotSerializableException
- mybaits非配置原因,导致SqlSession was not registered for synchronization异常
- 多线程程序切换输入法导致死机的问题及解决方案
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- 一次偶然的ajax请求导致status为canceled的原因
- Struts2异常!!!(原因LoginAction没有实现相应接口:SessionAware)
- 导致战略失败的三大原因
- APNS导致消息丢失和发送效率原因
- 关于点击<a>超链标签导致后台方法执行两次的原因
- Q:JDK6中的substring()方法容易导致内存泄露而JDK7不会出现这样的情况的原因
- 导致Asp.Net站点重启的10个原因
- 导致QTP运行缓慢的常见原因
- 导致交换机接口出现err-disable的几个常见原因
- BE备份VM导致死机