2

私は非常に奇妙な問題を抱えています。Amazon ec2 サーバーに mysql データベースをセットアップしています。ポート 3306 経由で接続できるように、Amazon ファイアウォールとルーター ファイアウォールを適切に開いています。次のように、コマンド ラインで Linux VM から ec2 サーバーに簡単に接続できます。

me@me-VirtualBox:~/host/workspace/rails-apps/sm$ mysql -h redacted.amazonaws.com -u redacted -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4012389
Server version: 5.5.20 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

したがって、接続は機能します。これにより、ファイアウォールを正常に通過できることが確認され、VM 内での実行によるおかしなビジネスは発生しません。だから今、私は次のようにRuby内から試してみます

require 'rubygems'
require 'mysql'

mycon = Mysql::new("redacted.amazonaws.com", "redacted", "redacted", "redacted")

symres = mycon.query("select * from symbols where symbol = \"AAPL\";")  

symres.each do |symbol|
  puts symbol[0].to_s
end

mycon.close

これにより、コマンド ラインに "AAPL" が出力されます。したがって、すべてがルビーの観点から機能しています。今度は ruby​​ on rails を使って接続してみます。

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: redacted
  pool: 5
  username: redacted
  password: redacted
  host: redacted.amazonaws.com 
  port: 3306

そこで、「rails server」コマンドを使用して、Rails サーバーを起動します。WebBRICK が正常に起動し、これが表示されます

me@me-VirtualBox:~/host/workspace/rails-apps/sm$ rails server
=> Booting WEBrick
=> Rails 3.2.7 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-08-18 10:00:08] INFO  WEBrick 1.3.1
[2012-08-18 10:00:08] INFO  ruby 1.8.7 (2011-06-30) [x86_64-linux]
[2012-08-18 10:00:14] INFO  WEBrick::HTTPServer#start: pid=9977 port=3000

ブラウザウィンドウを開いて接続します

http://localhost:3000 

クロムで。クロムは無期限に回転します。WebBRICK を起動したコンソール ウィンドウにメッセージが表示されません。Railsログに表示されるのはこれだけです:

Started GET "/" for 127.0.0.1 at Sat Aug 18 09:39:47 -0600 2012
Connecting to database specified by database.yml

5分間そのままにしておきますが、何も起こりません。ctrl-c で WebBRICK を強制終了する必要があります。

何が起こっているのかについての私の唯一の手がかりは、webrick がシャットダウンされた後、上記のように mysql を使用して接続しようとすると、次のエラーが発生することです。

me@me-VirtualBox:~/host/workspace/rails-apps/sm$ mysql -h redacted.amazonaws.com -u redacted -p
Enter password: 
ERROR 1129 (HY000): Host 'redacted.co.comcast.net' is blocked because of many    connection errors; unblock with 'mysqladmin flush-hosts'

したがって、これは ruby​​ on rails が接続に失敗していることを示しており (おそらく再試行のループで)、Amazon サーバーの mysql db がこれを検出し、そのホストの接続をブロックしています。そのため、Amazon ホストにログインし、flush-hosts コマンドを実行すると、コマンド ラインまたは Ruby スクリプトから接続できます。しかし、レールを接続することはできません。

Rails バージョン: 3.2.7 Ruby バージョン: 1.8.7 私の SQL サーバー バージョン: 5.5.20

何か案は?レール内の接続エラーが何であるかをデバッグする方法に途方に暮れています。スタック トレース、クラッシュ、または何が起こっているのかをデバッグするのに役立つものを取得していません。

4

2 に答える 2

0

mysql2 gemをテストするための簡単なrubyスクリプトを書いてみてください(すでにmysqlをテストしているように見えますが、railsアプリはmysql2を使用しています)。

また、ruby-debugまたはその他のデバッガーを使用してコードをステップ実行してみてください。

于 2012-08-18T16:56:20.620 に答える
0

最終的にこのスタックトレースを取得しました:

Railsがデータベースに再度接続する原因となる内部エラーがあるようです...デッドロックを引き起こします:

ActiveRecord::ConnectionTimeoutError (could not obtain a database connection within 5 seconds (waited 5.40695462 seconds). The max pool size is currently 25; consider increasing it.):
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:258:in `block (2 levels) in checkout'
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `loop'
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `block in checkout'
  /home/ubuntu/.rvm/rubies/ruby-1.9.3-p286/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:239:in `checkout'
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:102:in `block in connection'
  /home/ubuntu/.rvm/rubies/ruby-1.9.3-p286/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:101:in `connection'
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:410:in `retrieve_connection'
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_specification.rb:171:in `retrieve_connection'
  activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_specification.rb:145:in `connection'
  activerecord (3.2.11) lib/active_record/query_cache.rb:67:in `rescue in call'
于 2013-01-31T21:36:34.930 に答える