0

これが私のプログラムです。

require "mysql"

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

このプログラムを実行すると、終了しません。Ctrl+C実行を停止するには送信する必要があります。

このプログラムに接続を閉じさせ、すぐに適切に終了させるにはどうすればよいですか? (ルビー 2.0.0)

アップデート

新しい症状を発見しました。終了する代わりにハングし、無限ループを実行しているように見えます。私のCPUモニターは、1つのコアを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-cpackage とmysqlgem は Ubuntu Linux で問題なく動作します。(私はOS Xを使用しています)したがって、コアの問題は、によってインストールされたCコネクタのOS Xバージョンでしたbrew

これは少し遅くなる可能性がありますが、最終的なディストリビューションは Linux ベースになるため、dev マシンでは問題になりません。

于 2013-03-04T19:04:08.690 に答える