【问题标题】:Oracle database connection is not released after it exceeds maximum idle time in Rails app在 Rails 应用程序中超过最大空闲时间后不释放 Oracle 数据库连接
【发布时间】:2015-12-22 16:26:09
【问题描述】:

我有一个使用 Nginx HTTP 服务器和 Unicorn 应用服务器的 Rails 应用程序。当应用服务器大约 15 分钟未收到任何请求时,我收到以下错误:

OCIError: ORA-02396: 超过最大空闲时间,请重新连接

页面刷新后,页面加载正常。

我正在使用 rails 4.2.1、ruby-oci8 2.1.0 和 active-record-oracle_enhanced-adapter 1.6.0。

我对 Web 开发还比较陌生,但我认为当 oracle 连接空闲但应用服务器不知道连接错误时会发生此错误。

我每 15 分钟尝试一次 setting the reaping_frequency,但这并没有解决问题。

如何管理数据库连接并确保删除这些空闲连接?我可以设置超时以在 oracle 超时之前断开数据库连接吗?

这是我的配置/unicorn.rb

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
working_directory app_dir

worker_processes 2
preload_app true
timeout 15

listen "#{shared_dir}/sockets/unicorn.sock", :backlog => 64

stderr_path "#{shared_dir}/log/unicorn.stderr.log"
stdout_path "#{shared_dir}/log/unicorn.stderr.log"

pid "{shared_dir}/pids/unicorn.pid"

before_fork do |server,worker|
    if defined? ActiveRecord::Base
        ActiveRecord::Base.connection.disconnect!
    end
end

after_fork do |server,worker|
    if defined? ActiveRecord::Base
        ActiveRecord::Base.establish_connection
    end
end

【问题讨论】:

    标签: ruby-on-rails oracle timeout database-connection unicorn


    【解决方案1】:

    这是我的解决方法,但不是很好。

    在应用程序控制器中:

    before_action :refresh_connection
    
    def refresh_connection
        puts Time.now.to_s + ' - refreshing connection'
        ActiveRecord::Base.connection.disconnect!
    
        if ActiveRecord::Base.establish_connection
            puts Time.now.to_s + ' - new connection established' 
        else
            puts Time.now.to_s + ' - new connection cannot be established'
        end
    ebd
    

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      相关资源
      最近更新 更多