检查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还没有发布: