0

シングルトンクラスがモデルのオブジェクトを作成し、コードでさらに使用されるという状況があります。

ここでの問題は、アプリケーションとデータベース間の接続が切断され、その後のシングルトンへの呼び出しがすべて失敗することがあるということです。問題の修正に取り組んでいますが、すぐに回避策が必要です。私が考えている解決策はうまくいくと思いますが、メモリリークやデッドロックなどを引き起こすかどうかはわかりません.

元の(部分的な)コードは次のとおりです。

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 を追加する予定です。回避策として十分でしょうか、それともメモリ リークやデッドロックなどの問題が発生するのでしょうか?

より良い解決策があれば、喜んでお知らせします。

ありがとう

4

0 に答える 0