2010-02-01 30 views
3

我正在使用Rails 2.3.5和Oracle 10作爲我的數據庫,使用「oracle_adapter」和ruby-oci8連接到Oracle主機。爲什麼使用Rails和Oracle時會出現「無監聽者」錯誤?

我得到這個異常:

 
Completed in 463ms (View: 18, DB: 166) | 200 OK [http://192.168.30.128/auctions?page=1] 
/!\ FAILSAFE /!\ Mon Feb 01 19:02:11 +0800 2010 
    Status: 500 Internal Server Error 
    ORA-12541: TNS:no listener 
    env.c:257:in oci8lib.so 
    /home/qichunren/.gem/ruby/1.8/gems/ruby-oci8-1.0.7/lib/oci8.rb:229:in `initialize' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-oracle-adapter-1.0.0.9250/lib/active_record/connection_adapters/oracle_adapter.rb:623:in `new' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-oracle-adapter-1.0.0.9250/lib/active_record/connection_adapters/oracle_adapter.rb:623:in `new_connection' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-oracle-adapter-1.0.0.9250/lib/active_record/connection_adapters/oracle_adapter.rb:659:in `initialize' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-oracle-adapter-1.0.0.9250/lib/active_record/connection_adapters/oracle_adapter.rb:35:in `new' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-oracle-adapter-1.0.0.9250/lib/active_record/connection_adapters/oracle_adapter.rb:35:in `oracle_connection' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:223:in `send' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:223:in `new_connection' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:245:in `checkout_new_connection' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:188:in `checkout' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:184:in `loop' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:184:in `checkout' 
    /usr/local/ruby187/lib/ruby/1.8/monitor.rb:242:in `synchronize' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:183:in `checkout' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:98:in `connection' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:326:in `retrieve_connection' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_specification.rb:123:in `retrieve_connection' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_specification.rb:115:in `connection' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/query_cache.rb:9:in `cache' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/query_cache.rb:28:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:361:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/string_coercion.rb:25:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/rack-1.0.1/lib/rack/head.rb:9:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/rack-1.0.1/lib/rack/methodoverride.rb:24:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/params_parser.rb:15:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/session/cookie_store.rb:93:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/failsafe.rb:26:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `synchronize' 
    /home/qichunren/.gem/ruby/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:114:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/reloader.rb:34:in `run' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:108:in `call' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/cgi_process.rb:44:in `dispatch_cgi' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:101:in `dispatch_cgi' 
    /home/qichunren/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:27:in `dispatch' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/rails.rb:76:in `process' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/rails.rb:74:in `synchronize' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/rails.rb:74:in `process' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:159:in `process_client' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:158:in `each' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:158:in `process_client' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:285:in `run' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:285:in `initialize' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:285:in `new' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:285:in `run' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:268:in `initialize' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:268:in `new' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:268:in `run' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/configurator.rb:282:in `run' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/configurator.rb:281:in `each' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/configurator.rb:281:in `run' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/command.rb:212:in `run' 
    /home/qichunren/.gem/ruby/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281 
    /home/qichunren/.gem/ruby/1.8/bin/mongrel_rails:19:in `load' 
    /home/qichunren/.gem/ruby/1.8/bin/mongrel_rails:19 

似乎和Oracle的連接經常掉線。它顯示oracle error:**ORA-12541: TNS:no listener**

我該如何解決這個問題?

 
oci8.c:270:in oci8lib.so: ORA-12541: TNS:no listener (OCIError) 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-oracle_enhanced-adapter-1.2.4/lib/active_record/connec                   tion_adapters/oracle_enhanced_oci_connection.rb:223:in `new' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-oracle_enhanced-adapter-1.2.4/lib/active_record/connec                   tion_adapters/oracle_enhanced_oci_connection.rb:223:in `new_connection' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-oracle_enhanced-adapter-1.2.4/lib/active_record/connec                   tion_adapters/oracle_enhanced_oci_connection.rb:328:in `initialize' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-oracle_enhanced-adapter-1.2.4/lib/active_record/connec                   tion_adapters/oracle_enhanced_oci_connection.rb:24:in `new' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-oracle_enhanced-adapter-1.2.4/lib/active_record/connec                   tion_adapters/oracle_enhanced_oci_connection.rb:24:in `initialize' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-oracle_enhanced-adapter-1.2.4/lib/active_record/connec                   tion_adapters/oracle_enhanced_connection.rb:9:in `new' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-oracle_enhanced-adapter-1.2.4/lib/active_record/connec                   tion_adapters/oracle_enhanced_connection.rb:9:in `create' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-oracle_enhanced-adapter-1.2.4/lib/active_record/connec                   tion_adapters/oracle_enhanced_adapter.rb:50:in `oracle_enhanced_connection' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/c                   onnection_specification.rb:291:in `send' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/c                   onnection_specification.rb:291:in `connection=' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/c                   onnection_specification.rb:259:in `retrieve_connection' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/c                   onnection_specification.rb:78:in `connection' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb:2438:in `quoted_table_                   name' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb:1259:in `find_one' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb:1250:in `find_from_ids                   ' 
     from /opt/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb:504:in `find' 
     from script/maintenance/adjust_settlement.rb:19 

回答

2

首先,你應該使用oracle_enhanced adapter作爲原甲骨文適配器不再支持。而且我也推薦使用最新的ruby-oci8 version 2.0.3。並且還檢查你正在使用哪個Oracle客戶端版本 - 我推薦Oracle Instant Client 10.2.0.4或更高版本

但是,如果你得到ORA-12541:TNS:沒有監聽錯誤,那麼看起來問題可能在於網絡連接到數據庫或Oracle服務器端的一些問題。但請嘗試oracle_enhanced適配器和最新的ruby-oci8版本,並告訴它是否修復您的問題。

+0

呃,其實我使用這兩種測試紅寶石OCI8 2和1,和Oracle和oracle增強的適配器。 oracle instantclient 11_2 我發現在生產模式下,我幾乎沒有得到這個錯誤,但是在開發模式下,經常沒有聽到500響應代碼錯誤 – qichunren 2010-02-02 07:29:11

+0

如何修復?幫幫我! – qichunren 2010-05-21 03:56:10

2

確保:

  • 你正確設置在$ {ORACLE_HOME} /network/admin/tnsnames.ora的連接名稱。
  • 您在加載oci8驅動程序之前設置了ORACLE_HOME。

如果不工作,明確指定主機[:端口]/SID作爲數據庫名。

E.g.如果你的主機是mydbhost.myorg.org,端口號爲1522和SID是employeedb,你會使用這樣的:

database: mydbhost.myorg.org:1522/employeedb

如果你的端口是默認的1521,則可以省略冒號和端口號。

0

我認爲你的聽衆由於沒有活動而超時。我懷疑你打開連接,發出一個查詢,然後在代碼空閒等待另一個客戶端請求時,將連接打開。如果您的數據庫設置爲允許連接是永久性的,但可以用盡所有池,這是大多數站點不需要的,那麼這沒關係。

您可以調整數據庫以允許更長的會話,或者根本不要斷開連接,或者修改代碼以在嘗試發送查詢之前檢查連接,必要時重新連接,然後繼續。

不是所有的數據庫適配器都允許你執行keep-alive/heartbeat,或者甚至詢問服務器連接是否還活着,所以我必須恢復從異常處理程序中的表中包裝一個簡單的select 1,在繼續之前捅破連接。

另一種方法是在一個單獨的線程中放置一個簡單的「保持活動」例程,該線程定期執行一個簡單的請求,例如select 1,以保持數據庫的快樂。如果該例程檢測到連接已斷開,則它將負責將「db_connection_up」標誌設置爲false或重新連接。

您必須根據您要處理的請求數確定處理它的最佳方式。連接,發出一個微小的請求,然後重複斷開,是一種不同的壞事,所以你必須找到一個快樂的媒介。

與您的DBA交談以查看Oracle數據庫中的超時時間,以及是否可以更改或者是否可以獲得永久連接。如果沒有,調整你的代碼。

搜索「oracle監聽器超時」以瞭解更多信息。

0

Kelvin的答案適合我。另外,還有另一種方法。

我用鋼軌4.1.x的,Gemfile中:

gem 'activerecord-oracle_enhanced-adapter', '~> 1.5.0' 
gem 'ruby-oci8', '2.2.3' 

的database.yml:

# not work! 
host: 218.5.173.xxx/my_db 

# works, solution 1: 
database: 218.5.173.xxx/my_db 


# works, solution 2: 
database: "(DESCRIPTION= 
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=218.5.173.xxx)(PORT=1521))) 
(CONNECT_DATA=(SERVICE_NAME=my_db)) 
)" 
相關問題