3

我一直在开发一个连接到 Firebird 数据库并监听事件的程序。我试图让它与嵌入式数据库一起使用。

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)

经过多次谷歌搜索,我已经尝试过......

“虚拟机选项”: -Djava.library.path="C:\Users\jrile\Downloads\Jaybird-2.2.3JDK_1.6"

“FIREBIRD”和“PATH”系统变量: “C:\Users\jrile\Downloads\Firebird-2.5.2.26540-0_x64_embed”

使用 Windows 64 位和 Firebird Embedded 64 位。任何帮助将非常感激

4

2 回答 2

1

我创建了一个非常简单的程序来连接到嵌入式 Firebird:

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

我的数据库中表中160列的值在哪里。RDB$RELATION_IDRDB$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.

请注意,当您没有将 Firebird 嵌入到您的PATH(或 Java 应用程序的根文件夹中)时,您会遇到同样的错误。我的猜测是您正在尝试使用 32 位 Java 而不是 64 位版本来运行它。

于 2013-07-03T18:16:22.550 回答
1

在 Windows 7 64 位上同样的错误。

问题是 Firebird 嵌入式需要的不仅仅是 firebird 驱动程序和 jaybird dll。它需要firebird客户端DLL和“intl”文件夹(可能还有其他东西)。

通过从 sourceforge下载嵌入式 Firebird 文件并将其解压缩到我的应用程序根目录来解决。

无需修改 Windows PATH 变量。

要分发您的软件,请确保所有 Firebird 文件都包含在内且可访问。

于 2014-04-19T17:39:10.593 回答