Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查mysql与远程主机的连接_Mysql_Ruby On Rails_Validation_Activerecord_Model - Fatal编程技术网

检查mysql与远程主机的连接

检查mysql与远程主机的连接,mysql,ruby-on-rails,validation,activerecord,model,Mysql,Ruby On Rails,Validation,Activerecord,Model,我有一个模型来存储数据库连接参数主机,数据库名称,用户名,密码和填写它的形式。在创建或更新之前,我需要检查输入参数的连接是否良好。我创建验证:检查连接验证程序: # don`t change primary connection class Remote < ActiveRecord::Base; end def check_connection return if errors.any? || (!new_record? && password.empty?)

我有一个模型来存储数据库连接参数主机,数据库名称,用户名,密码和填写它的形式。在创建或更新之前,我需要检查输入参数的连接是否良好。我创建验证:检查连接验证程序:

# don`t change primary connection
class Remote < ActiveRecord::Base; end

def check_connection
  return if errors.any? || (!new_record? && password.empty?)
  begin
    Remote.establish_connection(
      adapter: 'mysql2',
      host: host,
      username: username,
      password: password,
      database: database,
      connect_timeout: 5,
      reconnect: false
    )
    # maybe need to make some sql request? did try it
  rescue Exception => e
    errors.add :connection, 'Could not connect to database'
  end
end
当我尝试输入accessible host localhost时,上面这样的代码效果很好。但如果主机喜欢192.168.1.1不可访问的页面冻结后提交表单。我每秒钟都会看到连接尝试,在ESC停止在浏览器加载页面后,它并没有停止。我在网络接口上看到tcpdump尝试。尝试并没有停止

那个么,如何验证到数据库的连接呢?若无法建立连接,页面必须不会加载很长时间

我确实使用了gem'mysql2'和bundle安装0.3.11版本。此版本忽略连接超时和更新版本修复的错误。在我尝试了0.3.12b4 gem'mysql2'之后,“~>0.3.12b4”一切正常。

变量connect\u timeout是一个全局变量。因此,mysql2可能会忽略它

在mysql5.6上:

mysql[(none)]> set connect_timeout = 123;
ERROR 1229 (HY000): Variable 'connect_timeout' is a GLOBAL variable and should be set with SET GLOBAL
我在初始化mysql2时设置了超时变量,但没有反映出来。mysql2的自述文件说可以设置*超时选项,但我认为自述文件已经过时或已损坏

在mysql2 0.3.14gem上:

client =  Mysql2::Client.new(
  host: 'localhost',
  database: 'test',
  username: 'root',
  password: '',
  connect_timeout: 3,
  read_timeout: 3,
  write_timeout: 3,
  wait_timeout: 3);

client.query('show variables like "%timeout%"').map{|r| [r["Variable_name"], r["Value"]] }

=> [["connect_timeout", "10"],
 ["delayed_insert_timeout", "300"],
 ["innodb_lock_wait_timeout", "50"],
 ["innodb_rollback_on_timeout", "OFF"],
 ["interactive_timeout", "28800"],
 ["lock_wait_timeout", "31536000"],
 ["net_read_timeout", "30"],  # Maybe older mysql has read_timeout?
 ["net_write_timeout", "60"], # Maybe older mysql has write_timeout?
 ["slave_net_timeout", "3600"],
 ["wait_timeout", "28800"]]
如果使用ActiveRecord,则只能通过database.yml设置wait_timeout变量

在database.yml中:

development:
  adapter: mysql2
  encoding: utf8
  charset: utf8
  database: test
  pool: 5
  username: root
  password: 
  host: localhost
  connect_timeout: 3
  read_timeout: 3
  write_timeout: 3
  wait_timeout: 3
ActiveRecord 4.0.1的一个结果:

> ActiveRecord::Base.connection.execute('show variables like "%timeout%"').to_a
=> [["connect_timeout", "10"],
 ["delayed_insert_timeout", "300"],
 ["innodb_flush_log_at_timeout", "1"],
 ["innodb_lock_wait_timeout", "50"],
 ["innodb_rollback_on_timeout", "OFF"],
 ["interactive_timeout", "28800"],
 ["lock_wait_timeout", "31536000"],
 ["net_read_timeout", "30"],
 ["net_write_timeout", "60"],
 ["rpl_stop_slave_timeout", "31536000"],
 ["slave_net_timeout", "3600"],
 ["wait_timeout", "3"]]
ActiveRecord在abstract\u mysql\u adapter.rb中设置wait\u timeout变量

见:

抽象_mysql_adapter.rb

mysql2_adapter.rb

我尝试在rails控制台Mysql2::Client.newhost:'192.168.1.1',数据库:'test',用户名:'user',密码:'pass',连接超时:1,读取超时:1,写入超时:1,并看到永久连接尝试。超时不起作用。怎么了?一年后,0.3.12还没有发布: