簡體   English   中英

getGeneratedKeys()在WildFly和Firebird中不適用於JNDI

[英]getGeneratedKeys() doesn't work with JNDI in WildFly with Firebird

我正在將getGeneratedKeys()與這樣的直接類調用一起使用:

public static Connection getConnection() throws Exception {
    try {
        Class.forName("org.firebirdsql.jdbc.FBDriver");
        String sql = "jdbc:firebirdsql:localhost/3050:e:\\COMPLEXO140116.FDB?defaultResultSetHoldable=True&encoding=WIN1252";
        return DriverManager.getConnection(sql, "SYSDBA", "masterkey");
    } catch (ClassNotFoundException e) {
        throw new SQLException("Driver nao localizado.");
    } catch (Exception e) {
        e.printStackTrace();
        throw new Exception("Erro na base de dados." + e.getMessage() + " fim msg");
    }
}

並且工作正常,但是在我更改為

public class ConnectionFactory {

    private static DataSource dataSource;

    static {
        try {
            dataSource = (DataSource) new InitialContext().lookup("java:jboss/Firebird");
        } catch (NamingException e) {
            throw new ExceptionInInitializerError("'jndifordbconc' not found in JNDI");
        }
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

}

出現錯誤,它將停止工作:

org.firebirdsql.jdbc.FBDriverNotCapableException:生成的鍵功能不可用,最可能的原因:ANTLR運行時在類路徑上不可用

我正在使用WildFly 10,Firebird 2.5.5,Jaybird 2.2.9。 在構建路徑中存在antlr-4.5.2-complete.jar,這也許不是原因,因為它在更改為JNDI方式之前已經在工作。 Wildfly帶有自己的antlr 2.7.7。

問題可能是類加載之一。 使用DriverManager.getConnection ,將在應用程序的上下文中創建連接,但是當您使用數據源時,將在應用程序服務器而不是當前應用程序的上下文中創建連接。 因此,如果antlr運行時在應用程序服務器本身的類路徑中不可用,則生成的密鑰功能不可用。

Jaybird需要使用antlr運行時版本3.4,據我所知,它不是antlr 2.7.7的一部分。 完整的antlr版本4.5.2包含與antlr-runtime 3.4兼容的類(有趣的是,antlr-runtime 4.5.2不兼容!),因此,如果這些類是您的應用程序的一部分,那么這將解釋其原因。在您的應用程序內部創建連接時確實起作用。

為了使它在從JNDI創建連接時正常工作,需要將antlr運行時添加到Jaybird的模塊描述符中(作為依賴項或作為資源)。

配置(如erickdeoliveiraleal最初添加到問題中):

我用以下代碼創建了一個文件夾,里面包含antlr-complete,並帶有一個新的module.xml:

<module xmlns="urn:jboss:module:1.3" name="org.antlr4">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>

    <resources>
        <resource-root path="antlr-4.5.2-complete.jar"/>
    </resources>

    <dependencies>
    </dependencies>
</module>

並在Firebird模塊中添加了<module name="org.antlr4"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM