シングルトンクラスがモデルのオブジェクトを作成し、コードでさらに使用されるという状況があります。
ここでの問題は、アプリケーションとデータベース間の接続が切断され、その後のシングルトンへの呼び出しがすべて失敗することがあるということです。問題の修正に取り組んでいますが、すぐに回避策が必要です。私が考えている解決策はうまくいくと思いますが、メモリリークやデッドロックなどを引き起こすかどうかはわかりません.
元の(部分的な)コードは次のとおりです。
1 file_path = File.expand_path(File.dirname(__FILE__))
2 require file_path + '/action_factory'
3 require 'erb'
4
5 class Manager
6
7 def initialize(logger)
8 @logger = logger
9 end
10
11 def log_exception(e,method_name)
12 @logger.log :ERROR,"Manager",method_name,'',$$,'',e.backtrace[0] + ": Uncaught Exception " + e.message,DateTime.now,'system',''
13 e.backtrace.shift
14 @logger.log :ERROR,"Manager",method_name,'',$$,''," from " + e.backtrace.join("\n from ") + "(" + e.class.to_s + ")",DateTime.now,'system',''
15 end
16 def execute_action
17 return false if addresses.collect{|a| a if !a.to_s.empty?}.compact.empty?
18 begin
19 action = ActionFactory.instance().get_action(type)
20 return true
21 rescue Exception => e
22 action = nil ####### I'm planning to add this line ####
23 log_exception(e,this_method_name)
24 return false
25 end
26 end
27 end
28 require 'singleton'
29 $file_path=File.expand_path(File.dirname(__FILE__))
30 Dir[$file_path + '/actions/*_action.rb'].each { |filename| require filename }
31
32 class ActionFactory
33 include Singleton
34
35 def get_action(type)
36 action_type_obj = ActionType.find(:first, :select => "action_name", :conditions => ["id=?",type])
37 if(action_type_obj.nil? or action_type_obj.action_name.nil?)
38 raise "Undefined Action Type"
39 else
40 return eval("Actions::#{action_type_obj.action_name}").instance
41 end
42 end
43 end
問題は、Oracle 接続が時々切断され、ステートメント #36 が失敗して InvalidStatement 例外が返されることです。ステートメント 19 の後続の呼び出しはすべて失敗します。
行 22 の例外ブロックにステートメント : action = nil を追加する予定です。回避策として十分でしょうか、それともメモリ リークやデッドロックなどの問題が発生するのでしょうか?
より良い解決策があれば、喜んでお知らせします。
ありがとう