如何关闭MySQL连接&在Ruby中立即退出程序?

时间:2013-03-04 08:29:39

标签: ruby database-connection

这是我的计划。

require "mysql"

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

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

如何让这个程序关闭连接并立即优雅地退出? (Ruby 2.0.0)

更新

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

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分: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包和mysql gem在Ubuntu Linux上运行良好。 (我使用OS X) 所以核心问题是由brew安装的OS X版C连接器。

这可能会慢一些,但在dev机器上并不重要,因为最终的分发将基于Linux。