2013-10-07 17 views
0

我使用ActiveRecord版本3.2.14(并尝试3.2.15 rc以及)与TinyTDS + activerecord sql适配器连接到我的SQL Server数据库。ActiveRecord连接随机Ruby方法死亡(.size,.each)

我遇到极其怪异的行为,其中此异常被抛出:

/usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record 
/connection_adapters/abstract/connection_pool.rb:410:in `retrieve_connection': 
ActiveRecord::ConnectionNotEstablished (ActiveRecord::ConnectionNotEstablished) 

,但根据跟踪:

from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:171:in `retrieve_connection' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:145:in `connection' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record/model_schema.rb:229:in `columns' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record/model_schema.rb:249:in `column_names' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record/model_schema.rb:262:in `column_methods_hash' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record/dynamic_matchers.rb:74:in `all_attributes_exists?' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record/dynamic_matchers.rb:27:in `method_missing' 
from /usr/local/debugging-exchange-test/app/controllers/new_orders_controller.rb:15:in `block in start' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record/relation/delegation.rb:6:in `each' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.14/lib/active_record/relation/delegation.rb:6:in `each' 
from /usr/local/debugging-exchange-test/app/controllers/new_orders_controller.rb:13:in `start' 
from /usr/local/debugging-exchange-test/lib/exchange.rb:57:in `testing' 
from /usr/local/debugging-exchange-test/lib/exchange.rb:39:in `initialize' 
from /usr/local/debugging-exchange-test/lib/exchange.rb:104:in `new' 
from /usr/local/debugging-exchange-test/lib/exchange.rb:104:in `<top (required)>' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/daemons-1.1.9/lib/daemons/application.rb:203:in `load' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/daemons-1.1.9/lib/daemons/application.rb:203:in `start_load' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/daemons-1.1.9/lib/daemons/application.rb:298:in `start' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/daemons-1.1.9/lib/daemons/controller.rb:70:in `run' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/daemons-1.1.9/lib/daemons.rb:147:in `block in run' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/daemons-1.1.9/lib/daemons/cmdline.rb:109:in `call' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/daemons-1.1.9/lib/daemons/cmdline.rb:109:in `catch_exceptions' 
from /usr/local/rvm/gems/ruby-1.9.3-p448/gems/daemons-1.1.9/lib/daemons.rb:146:in `run' 
from ./data_exchange:15:in `<main>' 

它的发生在这里的each方法:

def start 
    web_queue = Nti::Order.where("orderid IS NOT NULL AND updated_by_exchange_at IS NULL AND orderstatus <> 9") 
    logger.info "web_queue size: #{web_queue.length}" 
    web_queue.each do |nti_order| #<---- this line 
    # logger.info nti_order.orderid 
    web_order = Web::Order.find_by_id(nti_order.orderid) 
    raise "Couldn't find web order with ID #{nti_order.orderid}" if web_order.nil? 
    web_order.status = 99 
    web_order.save! 
    logger.info "Web order with ID #{web_order.id} updated to status = 99" 
    end 
end 

在此之前,我得到了相同的确切的错误b UT斯达康的这条线,因为.size方法:

logger.info "web_queue size: #{web_queue.size}"

当我把它改成.length它的工作原理。到底他妈发生了什么?这些方法与ActiveRecord无关。我的数组方法抛出ActiveRecord异常。

顺便说一句,这是一个ruby应用程序(不是rails),它使用activerecord在两个数据库之间交换数据。

而只是为了显示数据库连接的工作原理,当我改变要做到这一点的方法:

def start 
    a = Nti::Order.where("orderid IS NOT NULL AND updated_by_exchange_at IS NULL AND orderstatus <> 9") 
    logger.info a.first.inspect 
    logger.info "done" 
end 

它的工作原理。这也适用于:

def start 
    a = Nti::Order.where("orderid IS NOT NULL AND updated_by_exchange_at IS NULL AND orderstatus <> 9") 
    # logger.info a.size 
    puts a.map{ |order| order.orderid } 

    logger.info "done" 
end 

任何人都知道发生了什么事?

+0

他们*做*与AR有关,因为直到您真正需要数据之后,查询才会发生。从文档:“如果集合已经加载长度和大小是等价的,如果不是,并且无论如何你都需要记录,这个方法将减少一个查询,否则大小更有效。” –

+0

我更新了问题以显示它的工作示例 – Edmund

回答

0

尝试增加database.yml中的池大小。 将默认的pool: 5更改为较大的值。

+0

没有运气....同样的事情 – Edmund