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
我有一个 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