Oracle 数据库连接在超过 Rails 应用程序中的最大空闲时间后未释放

Oracle database connection is not released after it exceeds maximum idle time in Rails app

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

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

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

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

我对 Web 开发还是比较陌生,但我认为这个错误发生在 oracle 连接空闲但应用服务器不知道连接有问题时。

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

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

这是我的 config/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

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

在应用程序控制器中:

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