0

这是我的程序。

require "mysql"

db  =   Mysql.new("127.0.0.1", "root", "some password", "test")
db.close
db  =   nil

当我运行这个程序时,它没有完成。我需要发送Ctrl+C停止执行。

我怎样才能让这个程序关闭连接并立即优雅地退出?(红宝石 2.0.0)

更新

我发现了新的症状。它挂起而不是退出,并且似乎在运行无限循环。因为我的 CPU 监视器告诉我它正在使用 100% 的一个内核。我仍然不确定这是 Ruby 问题或 MySQL 库问题还是我的配置问题...

4

2 回答 2

1

你的脚本很好。

在您的特定情况下,它不会退出,因为客户端在连接到给定 IP 10.211.55.10 的服务器时超时。它甚至永远不会到达db.close

我已经在本地复制了这个。我更改了代码以连接到我的本地 MySQL,脚本立即退出。

当我手动连接客户端时,我可以重现相同的挂起:

$ mysql -u root -p -h 10.211.55.10
Enter password: [masked]
ERROR 2003 (HY000): Can't connect to MySQL server on '10.211.55.10' (60)

超时后出现错误消息。凭证是否正确?服务器是否接受连接?

于 2013-03-04T08:36:22.400 回答
0

我终于想出了解决方法。我已经安装了所有 brew、rvm、ruby 几乎 10 次,以确定问题出在哪里。这是因为糟糕的 MySQL 连接器 C 库。

我用 Homebrew 安装了连接器,

brew install mysql-connector-c

并使用了 ruby​​ gem 的包装器版本。

gem install mysql

无论如何,我尝试了基于纯红宝石的版本,但它没有挂起。效果很好。

brew remove mysql-connector-c
gem uninstall mysql
gem cleanup all

gem install ruby-mysql

# Now everything working well without hanging at last.

无论如何,mysql-connector-c包和mysqlgem 在 Ubuntu Linux 上运行良好。(我使用的是 OS X)所以核心问题是 OS X 版本的 C 连接器由brew.

这可能会慢一点,但在开发机器上并不重要,因为最终发行版将基于 Linux。

于 2013-03-04T19:04:08.690 回答