【问题标题】:TinyTds Error: Adaptive Server connection timed outTinyTds 错误:Adaptive Server 连接超时
【发布时间】:2015-02-03 09:54:36
【问题描述】:

我们正在使用当前 tinyTDS gem 0.6.2 在 rails 3.2.12 (ruby 1.9.3) 上运行 ruby​​ on rails 应用程序。

我们使用 MS SQL 2012 或 2014 并面临比平常更多的以下错误消息:

TinyTds::Error: Adaptive Server connection timed out: EXEC sp_executesql [...]

数据库自动关闭已关闭。 TCP Socket Timeouts 是默认的 Windows 系统。

应用程序服务器在机器 #1(Windows 服务器)上,SQL 服务器在机器 #2(Windows 服务器)上。

当我检查连接 (netstat) 时,我为大约 20-30 个用户打开了大约 250 个连接。 我运行 perform.exe 来查看 SQL Server 上数据和日志磁盘的空闲时间。

database.yml 有连接pool:32reconnect:true

在我看来,tinyTDS 似乎失去了连接,并且任何异常都会阻止重新连接。

问题是,如何调试问题以找出问题所在?

更新

我的错,原来的错误信息属于 tinytDS 0.5.x。由于我更新到最新版本,因此我额外或改为收到以下错误:

ActiveRecord::LostConnection (TinyTds::Error: DBPROCESS is dead or not enabled: BEGIN TRANSACTION):

【问题讨论】:

  • 另外,你编译的 FreeTDS 版本是什么?
  • 例如运行“tsql -C”会在大多数情况下显示系统有什么。
  • 我自己没有安装 tinyTDS,我在 windows 上使用了“gem install tinytds”。
  • "tsql -C" 是什么命令?你在应用程序或数据库服务器上运行它?
  • 啊,所以如果您使用的是预构建的 windows 二进制 gem,那么 FreeTDS 是 0.91,这是最新的稳定版,这也很好。我见过 unix 系统将 TinyTDS 编译为 FreeTDS v0.82 的问题,并且之前也曾引起过类似的问题。

标签: ruby-on-rails ruby sql-server tiny-tds


【解决方案1】:

首先,池大小似乎过大。你在使用大量线程吗?如果不是,那么每个应用请求/响应将只使用一个连接。只是看起来这个价值太高了。

二、什么SQL超时了?您是否发现某些 SQL 比其他 SQL 慢?如果是这样,那么您有两个选择。第一个是使用索引等标准实践来调整数据库。第二个是增加 database.yml 中的“超时”选项。默认超时为 5000,即 5 秒。您是否尝试将其设置为 10000?我想我要问的是您如何确定这是“连接”超时还是“等待”超时?

【讨论】:

  • 我们使用瘦服务器并在那里运行其中的两个,一个在端口 3101 上,一个在端口 3102 上,前端是一个处理负载平衡器的 apache。我们有一些问题,production.log 建议我们增加连接池,这就是为什么这么高。关于连接超时:没有创建连接超时的特殊sql,非常简单或复杂的,有时我们有超时,连接,而不是查询超时。超时已设置为 10000。
  • 我认为适配器中存在正常超时(它们发生)导致适配器崩溃的问题。很抱歉,我最近没有花太多时间在适配器上,所以我不知道。
  • 有没有我能查到的或者谁能查到?
  • 我怎样才能找出为什么适配器有 DEADLOCK 或 TIMEOUT 呢?最近一定是有原因的……
  • 嘿,我只是想知道是否在此问题上达成了解决方案?我们的公司在我们的应用程序中遇到了完全相同的问题。不同的情况(我们使用 Rufus Scheduler 来模拟多个线程),但是会发生同样的问题(DBPROCESS IS DEAD 并出现同样的错误信息)。
猜你喜欢
  • 2019-11-09
  • 1970-01-01
  • 2022-12-24
  • 2019-08-19
  • 2016-07-13
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
相关资源
最近更新 更多