奇怪的数据库超时问题

a391329412 2015-02-11 04:56:18
System.ComponentModel.Win32Exception: 等待的操作过时。
[Win32Exception (0x80004005): 等待的操作过时。]

今天发现IIS发布的服务器无法连接到数据库,提示以上错误,
更奇怪的是写了一个windwos 应用程序进行测试A,B服务器的数据库连接,分别连接两台不同服务器的数据库,
测试1
结果如下:
A服务器数据库,连接超时
B服务器数据库,正常可以查询出数据,

测试2

把windwos 应用程序进行测试A,B服务器的数据库连接

结果如下:
A服务器数据库,正常可以查询出数据,
B服务器数据库,正常可以查询出数据

本地的VS2012也是可以同时连接A、B两台服务器上的数据库的
在网上找了很久也没有可以解决这个问题的方法,请知道的朋友帮帮忙
...全文
847 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34189803 2017-11-06
  • 打赏
  • 举报
回复
帅哥解决没有,我也遇到同样的问题
於黾 2015-02-12
  • 打赏
  • 举报
回复
感觉跟客户端版本有关
zuoming120 2015-02-12
  • 打赏
  • 举报
回复
检查A数据库是不是数据库C盘满了或者其他原因。 这种问题大多是数据库本身问题。
dzwebs 2015-02-11
  • 打赏
  • 举报
回复
估计是返回的数据太大,超时之类的了
a391329412 2015-02-11
  • 打赏
  • 举报
回复
C服务器PING A、B通 A服务器PING C、B通 B服务器PING A、C通
a391329412 2015-02-11
  • 打赏
  • 举报
回复
程序在服务器C:运行结果为 A服务器查询用户数量:[Win32Exception (0x80004005): 等待的操作过时。] Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. B服务器查询用户数量:1000条 程序在服务器D:运行结果为 A服务器查询用户数量:1000条 B服务器查询用户数量:1000条 程序在本地:运行结果为 A服务器查询用户数量:1000条 B服务器查询用户数量:1000条 服务器C都可以ping到A、B两个服务器上的
a391329412 2015-02-11
  • 打赏
  • 举报
回复
程序在服务器C:运行结果为
A服务器查询用户数量:[Win32Exception (0x80004005): 等待的操作过时。]
Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement.

B服务器查询用户数量:1000条

程序在服务器D:运行结果为
A服务器查询用户数量:1000条
B服务器查询用户数量:1000条

程序在本地:运行结果为
A服务器查询用户数量:1000条
B服务器查询用户数量:1000条

服务器C都可以ping到A、B两个服务器上的
於黾 2015-02-11
  • 打赏
  • 举报
回复
相互都能ping通是吗 两个数据库都是一样的,服务器也都是一样的位数?
a391329412 2015-02-11
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
先检查服务器C和服务器A之间的网络,能ping通?
完是ping 的通的
於黾 2015-02-11
  • 打赏
  • 举报
回复
先检查服务器C和服务器A之间的网络,能ping通?
a391329412 2015-02-11
  • 打赏
  • 举报
回复
代码如上:写了两个查询数据库的代码,分别查询A、B两个服务器上的数据库的数据 放到服务器C: 查询结果 A服务器数据库返回超时, B服务器数据库返回正常,数据是可以查询的到的 进一步测试 把程序放到D服务器上 查询结果 A服务器数据库返回正常,数据是可以查询的到的 B服务器数据库返回正常,数据是可以查询的到的 程序在本地上运行 查询结果 A服务器数据库返回正常,数据是可以查询的到的 B服务器数据库返回正常,数据是可以查询的到的
a391329412 2015-02-11
  • 打赏
  • 举报
回复
A服务器,数据库连接 #region 数据库查询 static DataTable GetData(string cmdText, SqlParameter[] cmdParms) { string connectionString = "Data Source=A服务器;Persist Security info=True;Initial Catalog=数据库;User ID=sa;Password=密码"; SqlConnection conn = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand(cmdText, conn); if (cmdParms != null) { foreach (SqlParameter param in cmdParms) { cmd.Parameters.Add(param); } } SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dataTable = new DataTable(); try { conn.Open(); da.Fill(dataTable); conn.Close(); } catch(Exception ex) { Console.WriteLine(ex.Message); } finally { cmd.Parameters.Clear(); if (conn.State == ConnectionState.Open) { conn.Close(); } conn.Dispose(); } return dataTable; } #endregion B服务器,数据库连接 #region 数据库查询 static DataTable GetData(string cmdText, SqlParameter[] cmdParms) { string connectionString = "Data Source=b服务器;Persist Security info=True;Initial Catalog=数据库;User ID=sa;Password=密码"; SqlConnection conn = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand(cmdText, conn); if (cmdParms != null) { foreach (SqlParameter param in cmdParms) { cmd.Parameters.Add(param); } } SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dataTable = new DataTable(); try { conn.Open(); da.Fill(dataTable); conn.Close(); } catch(Exception ex) { Console.WriteLine(ex.Message); } finally { cmd.Parameters.Clear(); if (conn.State == ConnectionState.Open) { conn.Close(); } conn.Dispose(); } return dataTable; } #endregion
於黾 2015-02-11
  • 打赏
  • 举报
回复
看不懂你的测试1和测试2到底哪里不同 你不敢先说清楚数据库在哪,是都连的一个数据库,还是分别连的两个数据库,各自都在什么服务器上 什么windows应用程序,控制台?winform?在哪里测试的,是服务器上还是客户机上 信息这么不完整,让人瞎猜啊
  • 打赏
  • 举报
回复
谁知道你是怎样连接的呢?
课程背景:如果赶上一个语言火的时候,您想不赚钱都难,android ,苹果,大数据,python我们没有赶上第一批,现在go语言您还想错过吗?现在go语言已经在大公司开始使用,在做服务这块慢慢已经走上热点,现在go语言视频很少而且很基础,我们早已经带着学员开始做实战了。go语言大神班为有一定基础且想深入学习go的学员量身打造,拒绝平庸,与众不同!专技术:对整个大数据生态圈的相关技术都有一定的研究,深入理解Go的原理,熟练使用GO技术解决各种业务需求。通过我们课程中的企业级项目和通俗易懂的知道点分析让你更加深了的掌握Go技术!懂架构:对业务有一定的了解,并且可以根据不同的业务场景设计出最优的技术架构。通过我们课程中的企业真实项目,全方位掌握项目的整个开发周期,达到触类旁通的目的!擅调优:一般其他语言开发项目一般都有一定的性能瓶颈,使用GO需要深入掌握项目技术架构特点和技术原理方可对项目中的瓶颈进行调优。通过项目中的调优经验让你掌握该技能!善沟通:GO在项目中扮演一个非常重要的角色,一般是在企业里做服务这块,需要跟各个部门进行协调沟通,所以要具备良好的沟通能力,业务对接能力! 课程研发环境及内容简介:1.课程研发环境项目源代码以Go1.9.2为基准,数据库以mysql为基准,以下环境都适用于项目。开发工具:VScode;数据库工具:mysql  2.内容简介什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于网站中一些稀缺或者特价的产品,电商网站一般会在约定的时间对其进行限量销售,因为这些产品的特殊性,会吸引大量用户前来抢购,并且会在约定时间同时在秒杀页面进行抢购。设计思路将请求拦截在系统上游,降低下流压力;秒杀系统特点就是并发量极大,但实际秒杀成功的请求数量确很少,所以如果不在前端拦截可能造成数据库读写锁冲突,甚至导致死锁,最终请求超时,甚至导致系统崩溃充分利用缓存:利用缓存可以极大提高系统读写速度消息队列:消息队列可以削峰,将拦截大量并发的请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从消息队列中主动的拉取请求消息进行业务处理前端方案浏览器端(js):页面静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素,通过CDN来抗峰值禁止重复提交:用户提交之后按钮置灰,禁止重复提交用户限流:在某一时间内只允许用户提交一次请求,比如可以采取IP限流后端方案服务器控制器层(网关层)限制UID(userID)访问频率:我们上面拦截了浏览器的访问请求,但准对某些恶意请求和攻击或者其他插件,在服务器控制层要准对同一个uid,限制访问频率 服务层上面只拦截了一部分请求,当秒杀的用户量非常大时,即使每个用户只有一个请求,到服务层的请求数量还是很大。比如我们有100w用户同时抢购100台手机,服务层并发请求压力至少为100w。1.采用消息队列缓存请求:既然服务器层知道库存只有100台手机,那完全没有必要把100w个请求都传递到数据库里,那么可以先把这些请求都写到消息队列里面缓存一下,数据库层订阅消息减少库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束2.利用缓存应对读请求:对类似12306等购票业务,是典型的读多写少业务,大部分请求时查询请求,所以可以利用缓存分担数据库压力3.利用缓存对写请求:缓存也是可以应对写请求,比如我们可以把数据库中库存数据迁移到Redis缓存中,所有减库存操作都在Redis中进行,然后通过后台进程把Redis中的用户秒杀请求同步到数据库数据库数据库层是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截,数据库层只承担“能力范围内”的访问请求。所以,上面通过在服务层引入的队列和缓存,让底层的数据库高枕无忧

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧