程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORA-12545: 因目標主機或對象不存在, 連接失敗,ora-12545不存在

ORA-12545: 因目標主機或對象不存在, 連接失敗,ora-12545不存在

編輯:Oracle教程

ORA-12545: 因目標主機或對象不存在, 連接失敗,ora-12545不存在


ORA-12545: 因目標主機或對象不存在, 連接失敗

1. 問題描述

  XP系統下同時安裝了AX1應用程序和升級版AX2,連接同一個在本機Oracle客戶端上配置的連接實例,其中AX2顯示鏈接成功,而AX1卻鏈接失敗,其中Oracle實例配置一定正確,因為AX2已經鏈接成功。在此之前AX2和AX1都是能連接成功的,用戶使用360殺毒後,AX1才出現問題。

2. 問題分析

  通過日志分析,發現AX1返回的錯誤信息是“ORA-12545: 因目標主機或對象不存在, 連接失敗”。顯然這個信息是錯誤的, Oracle錯誤的判斷了問題的原因,因為我們所配置的主機是存在的,並且在AX2上已經鏈接成功了。

3. 解決辦法

  為避免AX1的動態庫影響,我們編寫純OCI的測試程序TestOCI.exe,這個exe只依賴Windows和OCI的動態庫,將這個測試程序分別放到AX2的Program、AX1的 Program以及桌面隨便的一個文件夾中,結果只有AX1的Program的顯示鏈接失敗,其他的兩個文件夾下的測試程序都成功了。這就證明一定是AX1的 Program下的什麼文件影響了連接過程。

  采用二分屏蔽法對AX1的Program所有文件進行分組測試,最後測試程序TestOCI.exe與ws2_32.dll 在同一個文件夾時,才會出現連接失敗的問題,顯然ws2_32.dll是Windows的Socket庫,這個庫出現在AX1的Program中時不正常的,所以可以斷定這個問題是由ws2_32.dll文件引起的。

  然後我們就為什麼這個庫會影響我們的測試程序進行了分析,分別在問題機器上進行測試兩組TestOCI.exe,一組是文件夾中只有測試exe,另一組文件夾中則包含測試exe和ws2_32.dll,分別打印這個exe啟動運行時所加載的動態庫。下面是兩組測試結果,只摘錄了部分重要信息。

  組1:文件夾中只有TestOCI.exe

Starting Directory: G:\AAA\Program\

Search Path:

C:\Program Files\Intel\iCLS Client\;

G:\app\Administrator\product\11.2.0\client_2\bin;

C:\Program Files\AMD APP\bin\x86;

C:\WINDOWS\system32;

C:\WINDOWS;

C:\WINDOWS\System32\Wbem;

C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;

C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;

C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;

C:\Program Files\Common Files\Autodesk Shared\;

G:\AAA\program;

G:\AAA\program

 

Loaded "c:\windows\system32\WS2_32.DLL" at address 0x71A20000.Successfully hooked module.

  組2:文件夾中同時包含TestOCI.exe和ws2_32.dll

Starting Directory: G:\AAA\Program\

Search Path:

C:\Program Files\Intel\iCLS Client\;

G:\app\Administrator\product\11.2.0\client_2\bin;

C:\Program Files\AMD APP\bin\x86;

C:\WINDOWS\system32;

C:\WINDOWS;

C:\WINDOWS\System32\Wbem;

C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;

C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;

C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;

C:\Program Files\Common Files\Autodesk Shared\;

G:\AAA\program;

G:\AAA\program

 

Loaded "g:\aaa\program\WS2_32.DLL" at address 0x71A20000.Successfully hooked module.

  從上面兩個測試結果我們可以看出,兩個測試程序的加載動態庫的搜索路徑是相同的,但是加載的ws2_32.dll動態庫卻不同,運行成功是加載c:\windows\system32下面的ws2_32.dll,而運行失敗則是加載g:\aaa\program下的ws2_32.dll。g:\aaa\program\ws2_32.dll只有85K,而c:\windows\system32\WS2_32.DLL卻有291K,顯然g:\aaa\program\ws2_32.dll是一個錯誤的庫,同時Windows的Socket是一整套的,只有這一個庫被加載後,其他Socket庫沒有被加載也會出現問題。

  這個問題只出現在XP中,而在Win7中卻不出現,可能的一個原因是XP和Win7搜索路徑的優先級別不大相同吧,或是某些東西改變了動態庫加載的環境等,但是不能確定。

4. 解決辦法

  刪除AX1/Program下的ws2_32.dll,即可恢復連接Oracle數據庫。

版權所有,轉載請注明出處。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved