2014-01-06 21 views
2

這是一個使用ActiveRecord的oracle增強適配器gem連接到Oracle的ruby項目。 這顆寶石是OCI8的包裝。OCI8 - 僅在第一次嘗試時出現「連接失敗,因爲目標主機或對象不存在」

ActiveRecord::Base.establish_connection(
    :adapter => "oracle_enhanced", 
    :database => "xxx.xxx.xxx.xxx:1521/nnnn", 
    :username => "some_user_name", 
    :password => "very_secret_password" 
) 
ActiveRecord::Base.pluralize_table_names = false 

class All_tables < ActiveRecord::Base 
end 

好吧,讓我們測試一下。

[1] pry(main)> All_tables.take 
OCIError: ORA-12545: Connect failed because target host or object does not exist 
from oci8.c:513:in oci8lib_200.so 

給它5秒鐘,然後再試一次。

[2] pry(main)> All_tables.take 
#<All_tables owner: "SYS", table_name: "DUAL", tablespace_name: "SYSTEM",.... 

此替代方法可以完成這項工作,但感覺有點髒。

retrylimit=5 
begin 
    All_tables.take 
rescue 
    sleep 2 
    puts "retrying" 
    retrylimit -= 1 
    retry if retrylimit > 0 
end 

看起來像一個經典的超時,但...如果它是一個超時,在哪裏以及如何配置它? 注意:已經嘗試過:establish_connection中的timeout => 5000。沒有工作。

回答

0

我假設xxx.xxx.xxx.xxx是主機名。檢查ActiveRecord機器上的DNS配置。嘗試使用nslookup和ping來診斷爲什麼 - 有時 - 遠程計算機名稱無法解析。對於OCI,名稱解析也可能太慢,所以它在第一次嘗試時失敗。然後解決方案被緩存下一次嘗試成功。嘗試使用IP地址。

對Oracle客戶端啓用SQL * Net跟蹤。這可以提供足夠的信息來積極回答你的問題。

相關問題