第一次请求后我有这个错误:
[CachedConnectionManager] Closing a connection for you. Please close them yourself
我认为这是因为JBoss使用连接池并期望rails(jruby)在每次使用后释放连接,这是错误的,因为rails(ActiveRecord)有自己的连接池.
我试着打电话
ActiveRecord::Base.clear_active_connections!
在每个请求之后,在after_filter中,但这没有用.
有人有点想法吗?
提前致谢.
解决方法 我也有尝试在Glassfishv3容器中以多线程模式运行Sinatra / ActiveRecord应用程序的连接池问题.该应用程序包含一个“before”块,其中包含ActiveRecord :: Base.connection以强制获取线程拥有的连接,以及一个带有ActiveRecord :: Base.clear_active_connections的“after”块!释放该连接.多线程模式
我已经尝试了很多ActiveRecord 3.0.12和3.2.3,JNDI和Glassfish连接池,只需使用ActiveRecord的连接池,甚至猴子修补ActiveRecord连接池以完全绕过它,直接使用Glassfish池.
使用简单的多线程http提取程序进行测试时,我尝试过的所有变体都会导致错误,当我增加http提取程序中的工作线程时,失败请求的百分比也会增加.
对于AR 3.0.12,典型的错误是Glassfish池抛出超时异常(因为它值得,我的AR连接池比我的Glassfish池大;我理解AR将汇集连接适配器对象,并且arjdbc将获取和释放幕后的实际连接).
使用AR 3.2.3,我得到了一个更不祥的错误.下面的错误来自不使用JNDI但仅使用ActiveRecord连接池的测试.这是一个更好的配置,大约95%的请求完成正常.错误请求因此异常而失败:
org.jruby.exceptions.RaiseException: (ConcurrencyError) Detected invalID hash contents due to unsynchronized modifications with concurrent users at org.jruby.RubyHash.keys(org/jruby/RubyHash.java:1356) at ActiveRecord::ConnectionAdapters::ConnectionPool.release(/Users/pat/app/glassfish/glassfish3/glassfish/domains/domain1/applications/lookup_service/WEB-INF/gems/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:294) at ActiveRecord::ConnectionAdapters::ConnectionPool.checkin(/Users/pat/app/glassfish/glassfish3/glassfish/domains/domain1/applications/lookup_service/WEB-INF/gems/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:282) at MonitorMixin.mon_synchronize(classpath:/meta-inf/jruby.home/lib/ruby/1.9/monitor.rb:201) at MonitorMixin.mon_synchronize(classpath:/meta-inf/jruby.home/lib/ruby/1.9/monitor.rb:200) at ActiveRecord::ConnectionAdapters::ConnectionPool.checkin(/Users/pat/app/glassfish/glassfish3/glassfish/domains/domain1/applications/lookup_service/WEB-INF/gems/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:276) at ActiveRecord::ConnectionAdapters::ConnectionPool.release_connection(/Users/pat/apps/glassfish/glassfish3/glassfish/domains/domain1/applications/lookup_service/WEB-INF/gems/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstrac/connection_pool.rb:110) at ActiveRecord::ConnectionAdapters::ConnectionHandler.clear_active_connections!(/Users/pat/apps/glassfish/glassfish3/glassfish/domains/domain1/applications/lookup_service/WEB-INF/gems/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:375) ...
单线程模式
失去对ActiveRecord(或arjdbc?)的一般线程安全性的信心,我放弃了使用ActiveRecord多线程和配置的warbler和JRuby-Rack做JRuby运行时池,模拟多个单线程Ruby进程,就像Unicorn,Thin和其他典型的Ruby服务器.
在config / warble.rb中:
config.webxml.jruby.min.runtimes = 10 config.webxml.jruby.max.runtimes = 10
我这次使用JNDI重新进行了测试,所有请求都完成了没有错误!
我的Glassfish连接池大小为5.请注意,jruby运行时的数量大于连接池大小.使JRuby运行时池大于数据库连接池可能没什么意义,因为在这个应用程序中,每个请求都使用数据库连接,但我只是想确保即使争用数据库连接我也没有时间 – 我在多线程模式下看到的错误.
至少可以说,这些并发性问题令人失望.是否有人在温和并发下成功使用ActiveRecord?我知道在Rails应用程序中,必须调用config.threadsafe!避免全局锁定.查看代码,它似乎不会修改任何ActiveRecord设置;有没有ActiveRecord的配置我不做?
总结以上是内存溢出为你收集整理的ruby-on-rails – 如何使用JRuby解决JBoss上的CachedConnectionManager错误?全部内容,希望文章能够帮你解决ruby-on-rails – 如何使用JRuby解决JBoss上的CachedConnectionManager错误?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)