这是我的计划。
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库问题或我的配置问题......
答案 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。