2013-07-03 210 views
3

我一直在研究一個連接到Firebird數據庫並監聽事件的程序。我試圖讓它與嵌入式數據庫一起工作。無法加載Firebird客戶端庫:Jaybird嵌入式數據庫

EventManager em = new FBEventManager(GDSType.getType("EMBEDDED")); 
em.setHost("localhost"); 
em.setDatabase("C:\\test.fdb"); 
em.connect(); 
Exception in thread "main" java.lang.RuntimeException: Failed to initialize Jaybird native library. This is most likely due to a failure to load the firebird client library. 
    at org.firebirdsql.gds.impl.jni.JniGDSImpl.attemptToLoadAClientLibraryFromList(JniGDSImpl.java:106) 
    at org.firebirdsql.gds.impl.jni.EmbeddedGDSImpl.<init>(EmbeddedGDSImpl.java:31) 
    at org.firebirdsql.gds.impl.jni.EmbeddedGDSImpl.<init>(EmbeddedGDSImpl.java:21) 
    at org.firebirdsql.gds.impl.jni.EmbeddedGDSFactoryPlugin.getGDS(EmbeddedGDSFactoryPlugin.java:40) 
    at org.firebirdsql.gds.impl.GDSFactory.getGDSForType(GDSFactory.java:220) 
    at org.firebirdsql.event.FBEventManager.<init>(FBEventManager.java:91) 
    at eventhandler.FirebirdEventMaster.<init>(FirebirdEventMaster.java:42) 
    at eventhandler.FirebirdEventMaster.getInstance(FirebirdEventMaster.java:33) 
    at eventhandler.Driver.main(Driver.java:13) 

多的谷歌搜索後,我已經試過......

「VM選項」: -Djava.library.path =「C:\用戶\ jrile \下載\ Jaybird -2.2.3JDK_1.6"

「火鳥」 和 「PATH」 系統變量: 「C:\ Users \用戶jrile \下載\火鳥-2.5.2.26540-0_x64_embed」

使用Windows 64位和Firebird嵌入式64位。任何幫助,將不勝感激

+0

我不使用java/jaybird,但通常使用嵌入式,您不應該指定主機,甚至不是本地主機,只是指向數據庫的路徑。另外它被視爲連接到「完整服務器」,而不是嵌入式。 – ain

+0

是的,我想這沒有意義,謝謝!評論說,但我仍然得到相同的錯誤。 – jongusmoe

+1

這應該工作(雖然沒有必要設置FIREBIRD環境變量)。你確定你在64位JVM上運行嗎?另外,你如何運行你的程序(從IDE或命令行),以及PATH變量設置爲何時以及如何包含嵌入式Firebird的位置? –

回答

1

我創建了一個非常簡單的程序連接到火鳥嵌入式:

package pkg; 

import java.sql.*; 

public class MainClass { 

    public static void main(String[] args) throws SQLException { 
     try (Connection con = DriverManager 
       .getConnection("jdbc:firebirdsql:embedded:D:/data/db/testdatabase.fdb", "sysdba", "")) { 
      try (
       Statement stmt = con.createStatement(); 
       ResultSet rs = stmt.executeQuery("SELECT * FROM RDB$DATABASE"); 
      ) { 
       while (rs.next()) { 
        System.out.println(rs.getString(2)); 
       } 
      } 
     } 
    } 
} 

這是一個佈局:

src 
+--pkg 
    +--MainClass.java 

我打開一個命令提示符,就去到src文件夾並編譯:

javac -cp . pkg\MainClass.java 

我更新了我的路徑以包含64位Firebird嵌入的文件

...\src>SET PATH=%PATH%;D:\Development\project\JaybirdEclipse\native_test_files_64bit 

..\src>java -cp .;D:\Development\libs\Jaybird-2.2.3JDK_1.7\jaybird-full-2.2.3.jar 
     -Djava.library.path=D:\Development\libs\Jaybird-2.2.3JDK_1.7 
     pkg.MainClass 
160 

哪裏160RDB$RELATION_ID列在表RDB$DATABASE我的數據庫中值。

現在,如果不是我與32位JRE執行,我得到的是你有確切的同樣的錯誤:

...\src>"C:\Program Files (x86)\java\jre7\bin\java" 
     -cp .;D:\Development\libs\Jaybird-2.2.3JDK_1.7\jaybird-full-2.2.3.jar 
     -Djava.library.path=D:\Development\libs\Jaybird-2.2.3JDK_1.7 
     pkg.MainClass 
Exception in thread "main" java.lang.RuntimeException: Failed to initialize 
Jaybird native library. This is most likely due to a failure to load the firebird 
client library. 

注意,這是當你不包括嵌入式火鳥你得到同樣的錯誤在您的PATH(或您的Java應用程序的根文件夾中)。我的猜測是你試圖用32位Java而不是64位版本來運行它。

1

Windows 7 64位上的相同錯誤。

問題是,嵌入Firebird需要更多的只是firebird驅動程序和jaybird dll。它需要firebird客戶端DLL和「intl」文件夾(可能還有其他東西)。

通過下載embedded Firebird file fro sourceforge來解決,並將其解壓縮到我的應用程序根目錄中。

無需修改Windows PATH變量。

要分發您的軟件,請確保所有的Firebird文件都包含在內並且可以訪問。