我有这种情况,其中单例类创建模型的对象并在我的代码中进一步使用。
现在,问题是应用程序和数据库之间的连接有时会中断,并且所有后续调用单例都会失败。在我努力解决此问题时,需要立即采取解决方法。我相信我正在考虑的解决方案会起作用,但不确定它是否会泄漏内存、导致死锁等。
这是原始(部分)代码:
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。这是否足以作为一种解决方法,还是会带来更多问题,如内存泄漏、死锁等?
如果有更好的解决方案,我会很高兴听到。
谢谢