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