红俊's profile蝈蝈俊的共享空间PhotosBlogListsMore ![]() | Help |
|
蝈蝈俊的共享空间July 03 Connection Pool Timeout 与 Connect Timeout = 0最近在做多线程处理数据库的程序时,这个程序总是会报如下错误: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 System.Data 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Open() 仔细用 SQL Server Management Studio 中的 Activity Monitor 查看数据库链接,竟然是只有2,3个数据库链接时,就报上述错误,很是怪异。 一步步删除掉代码,反复试验后,竟然是数据库链接字符串中的 Connect Timeout=0 来作怪的。 比如下述数据库链接字符串就会出现上述问题, Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=DB1;server=(local);Connect Timeout=0 而把数据库链接字符串修改为 就不会有问题了。
这个bug在微软的反馈中可以看到,如下: 其中微软的官方反馈是: The fix was submitted to the source branch of the next major .Net release.
照这么说,估计.net 4.0 中会修复这个bug。
参考资料: Why Does a Connection Pool Overflow? Trace a SqlConnection - Connection Pooling issues Fixing connection pooling timeout exceptions on third-party code Connection Pooling and the "Timeout expired" exception FAQ ADO.NET Connection Pooling at a Glance http://support.microsoft.com/kb/310617/ ADO.NET数据连接池 关于ADO.Net连接池(Connection Pool)的一些个人见解 How to: Open Activity Monitor (SQL Server Management Studio) Connect Timeout = 0 / Connection Pool Timeout June 23 PowerPoint插件出问题的解决方法今天很怪异,我的PowerPoint出现了下面的提示对话框后,不论我选择是或者否,我的PowerPoint都再也打不开了。 网上搜索了相关资料,通过下面步骤删除这个插件后,就可以正常使用了。
参考资料: 启用或禁用 Office 程序中的加载项 June 17 硅脂硅脂对CPU的热量向散热风扇的传递很重要,上周对我家电脑的处理对此深有感受。特写此篇Blog。 之前我家的台式机由于频繁出现无法启动。症状是:主板灯亮,风扇都在转,但是就是无法启动,而且主板没有任何嘟嘟提醒。每次碰到这种情况,我需要把CPU拆下来,重新装上去才可以启动。我怀疑就是CPU热量散不出去的原因,在能启动的时候,通过进入主板的管理界面,看到一开机,CPU的温度就是74度。风扇乌鸦乌鸦的响。 后来就是买了硅脂,涂在风扇跟CPU接触面上后,开机进入BIOS 后,发现CPU温度只有三十多度,玩一个3D的游戏时,也只有60度。之前不能启动的问题也就解决了。由于我家电脑的风扇是可以根据温度变转速的,之前开机后风扇很响的问题也解决了。 参考: 实践出真知-4种硅脂涂法详尽测试 June 12 Html5上周五参加Google开发者日,给我冲击最大的是Html5。对我的冲击主要有2点: 1、Html 5 可以带来丰富的用户体验。 开发者日中Google演示的用Html5开发的Wave(一个Mail的应用)就被Google玩的很炫。邮件、IM、博客、照片等功能融合在一起。特别是可以在一个邮件中,几个相关人能够协同讨论,不再像从前一样一个问题可以讨论N个邮件。从现场多次的掌声中可以看到这个东西很强大。它可以实现现在Flash\Silverlight才能提供的功能。 下面是 Wave 的一个截图 图片来源自:http://google.org.cn/2009/05/29/google-wave-a-new-communication-platform-for-a-new-web-2/ 2、各种浏览器支持Html5的步伐很快。 Html5的规范不象之前,九几年就出来的规范,不久前普及,这次Html5的支持,进展很快。HTML 5还没有标准化,但Firefox、Chrome、Safari和Opera已经引入了它的元素。很难想象的是一个处于草案解决的规范,已经有众多浏览器支持了。一些支持信息如下: 图片来源自: http://radar.oreilly.com/2009/05/google-bets-big-on-html-5.html
小结 进展很快,功能强大,由于Google等大公司的推进,很快我们将能看到Html5的更多应用,这是一个值得关注的领域。
参看: Google Wave会影响RIA/Silverlight吗? 谷歌开发者日:Google Wave将基于BSD协议开源 Google I/O 2009现场视频之HTML 5之歌 Google力挺HTML 5 或成未来应用核心 HTML 5 正式标准恐将2022年才能正式发布 Firefox 3.1开始支持HTML 5 视频和音频 多线程与SqlConnection.Close我做的一个Windows Form 程序碰到一个很怪异的多线程情况,最后检查进去竟然是部分代码的数据库链接没有关闭导致的。 我的这个程序是多线程程序,每个线程不间断的从数据库中取得数据,然后对取出的数据进行处理,一直循环到没有需要处理的数据为至。每个线程的循环是上万次的,即,每个线程上万次的数据库链接打开操作。 这个程序碰到怪异的现象是: 在A服务器上,没有任何问题,在B服务器上程序开一个线程没有任何问题,开多个线程则只有一个线程没问题,其他线程都有问题。 对每一个线程都作 try catch 拦截,就会看到出错线程报如下错误: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 System.Data 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Open() 从这个异常就可以看到,是数据库链接对象池中没有可用的链接了。 再分析下去,就是其中一部分从数据库中读数据的代码,没有调用 SqlConnection.Close。
分析我这个程序出现的规律: 单线程,不主动调用 SqlConnection.Close 这时候竟然数据库链接池不会报没有可用资源: 数据库链接对象池的默认最大容量为100,单线程对数据库链接打开的请求超过10000的。 显然这种情况下,虽然没有手工SqlConnection.Close,但是这些数据库链接SqlConnection还是回到了数据库链接对象池中了。 多线程时,不主动调用 SqlConnection.Close。 只有一个线程在跑,其他线程都报上述错误。 显然,多线程时,数据库链接对象池都被一个线程占住了,其他线程获得不了可用分数据库链接。
这个多线程怪异的特征,之前一直没想到会是SqlConnection.Close导致的,一直在其他方面想可能的问题。这次经验教训后,心得就是:
参考资料: FIX: Error message when a "System.Data" thread tries to open a pooled connection in the .NET Framework 2.0: "Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool http://support.microsoft.com/kb/948868/en-us
使用连接池 Connection Pooling for the .NET Framework Data Provider for SQL Server |
||||||
|
|