2015-12-22 1 views
0

J'ai une application Rails utilisant un serveur HTTP Nginx et un serveur d'application Unicorn. Je reçois l'erreur suivante lorsque le serveur d'application ne reçoit pas de demandes pour environ 15min:La connexion à la base de données Oracle n'est pas validée lorsqu'elle dépasse le délai d'inactivité maximum dans l'application Rails

OCIError: ORA-02396: Dépassé le temps d'inactivité maximale, s'il vous plaît vous connecter à nouveau

Après une actualisation de la page, la page charges bien. J'utilise les rails 4.2.1, ruby-oci8 2.1.0 et active-record-oracle_enhanced-adapter 1.6.0.

Je suis encore relativement nouveau dans le développement Web, mais je pense que cette erreur se produit lorsque la connexion Oracle est désactivée mais que le serveur d'applications ne sait pas que la connexion est mauvaise.

J'ai essayé setting the reaping_frequency toutes les 15 minutes, mais cela n'a pas résolu le problème.

Comment puis-je gérer les connexions à la base de données et m'assurer que ces connexions inactives sont supprimées? Puis-je définir un délai d'expiration pour supprimer les connexions à la base de données avant l'expiration d'Oracle?

c'est ma 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 

Répondre

1

Voici ma solution, ce qui est pas terrible.

dans le contrôleur de la demande:

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