mysql – 在forked / threaded应用程序中运行时,ActiveRecord无法重新连接?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 在forked / threaded应用程序中运行时,ActiveRecord无法重新连接?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2233字,纯文字阅读大概需要4分钟。
内容图文
![mysql – 在forked / threaded应用程序中运行时,ActiveRecord无法重新连接?](/upload/InfoBanner/zyjiaocheng/912/17a96fd0ba29442980999fcdfcbed9ec.jpg)
这里有一个开放式问题,所以我先概述一下这个问题.我们有一个Resque工作者应该从队列中弹出数据同步作业,原因是双重的,使用Cron(并且支持Rails环境引导时间一遍又一遍)很糟糕,以及替代队列,Github做的很好在他们announced Resque时,对他们来说是个很好的例子.此外,Redis时间序列功能已经成为我们基础设施的重要组成部分,我们也将TS数据混入RRDTool&等等…
这是问题,工作之间通常有三个小时(但工作人员可以随时安排工作……因此队列),PostgreSQL服务器消失了.很容易治愈,我期望设置重新连接:在相应的环境下确保这将按预期工作.我在few places中读到重新连接:true对于使用fork()的应用程序不起作用.这自然是Resque,开始它的工作者…我不明白的部分是为什么ActiveRecord的重新连接在这些情况下无法工作?
我注意到了重新连接的实现! ActiveRecord中的MySQL Adapter和PostgreSQL Adapter是不同的……但无论哪种方式,我都希望ActiveRecord重新连接:true配置才能工作.
The problem seems to be clear enough, when the child process exists, it closes the file handles created by the parent (thus hanging up the connection to the database) – is it possible to close a filehandle in such a way that ActiveRecord doesn’t recognise that the connection has been terminated?
还有,值得一提的是ActiveRecord aware fork(),我能在Github上找到它作为一个馅饼 – 它没有经过测试,但我认为它有效(没有用现有的Rails试过……)
我的问题是,如果你fork(),为什么AR中的自动重新连接不起作用? (而且,后来 – 我不能成为唯一一个遇到这个问题的人;我正在将它用于使用带有Resque的PGSQL!)
解决方法:
虽然不完全是“为什么它不能重新连接”的答案,但我认为可以帮助你的是以下代码放在初始化阶段的某个地方:
Resque.after_fork do |job|
ActiveRecord::Base.connection.reconnect!
end
更新:
关于重新连接 – 似乎它只是MySQL的功能.
这是它在mysql适配器中的使用方式:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb#L848
如您所见,它使用底层驱动程序的重新连接功能.
https://github.com/kwatch/mysql-ruby/blob/master/ext/mysql.c#L923
另一方面,postgresql适配器对重新连接选项没有任何作用,你可以看到https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
此外,PostgreSQL网站明确表示“使用开放的libpq连接分叉进程可能会导致不可预测的结果” – http://www.postgresql.org/docs/9.0/interactive/libpq-connect.html
而且很明显C驱动程序不提供任何重新连接功能.
内容总结
以上是互联网集市为您收集整理的mysql – 在forked / threaded应用程序中运行时,ActiveRecord无法重新连接?全部内容,希望文章能够帮你解决mysql – 在forked / threaded应用程序中运行时,ActiveRecord无法重新连接?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。