加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何使用JRuby解决JBoss上的CachedConnectionM

发布时间:2020-12-17 02:00:58 所属栏目:百科 来源:网络整理
导读:我有一个问题是将J Ruby Rails应用程序部署到JBoss中,使用JNDI来管理数据库连接. 第一次请求后我有这个错误: [CachedConnectionManager] Closing a connection for you. Please close them yourself 我认为这是因为JBoss使用连接池并期望rails(jruby)在每次
我有一个问题是将J Ruby Rails应用程序部署到JBoss中,使用JNDI来管理数据库连接.
第一次请求后我有这个错误:

[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的配置我不做?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读