删除单例对象并在ruby中重建

时间:2013-06-04 08:07:13

标签: ruby-on-rails singleton

我遇到这种情况,其中单例类创建模型的对象,并在我的代码中进一步使用。

现在,问题是应用程序和数据库之间的连接偶尔会被破坏,并且对单例的所有后续调用都会失败。在我正在努力解决问题时,需要立即采取解决方法。我相信我正在考虑的解决方案可以工作,但不确定它是否会泄漏内存,导致死锁等。

这是原始(部分)代码:

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。这是否足以作为一种解决方法,还是会带来更多内存泄漏,死锁等问题?

如果有更好的解决方案,我会很高兴听到。

由于

0 个答案:

没有答案