Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java getGeneratedKeys()不';t在WildFly和Firebird中与JNDI合作_Java_Jndi_Wildfly_Firebird_Jaybird - Fatal编程技术网

Java getGeneratedKeys()不';t在WildFly和Firebird中与JNDI合作

Java getGeneratedKeys()不';t在WildFly和Firebird中与JNDI合作,java,jndi,wildfly,firebird,jaybird,Java,Jndi,Wildfly,Firebird,Jaybird,我使用getGeneratedKeys()进行直接类调用,如下所示: public static Connection getConnection() throws Exception { try { Class.forName("org.firebirdsql.jdbc.FBDriver"); String sql = "jdbc:firebirdsql:localhost/3050:e:\\COMPLEXO140116.FDB?defaultResul

我使用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.fbrivernotcapableexception:生成的密钥 功能不可用,最可能的原因: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运行时3.4兼容的类(有趣的是,antlr运行时4.5.2不兼容!),因此,如果这些类是应用程序的一部分,那么这将解释为什么在应用程序内部创建连接时它会起作用

为了在从JNDI创建连接时使其工作,您需要将antlr运行时添加到Jaybird的模块描述符中(作为依赖项或资源)

配置(与最初的问题相同):

我创建了一个文件夹,其中包含antlr complete和一个新的module.xml,代码如下:



并在Firebird模块中添加了

@erickdeoliveiraleal如果我将您对问题的编辑移到我的答案中,是否有任何异议?谢谢,wildfly 18和Jaybird 3.0.8解决了相同的问题