我正在使用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-Runtime not 在类路径上可用
我正在使用WildFly 10,Firebird 2.5.5,Jaybird 2.2.9。 antlr-4.5.2-complete.jar存在于buildpath中,也许这不是原因,因为它在更改为JNDI方式之前工作。野生蝇携带它自己的蚂蚁2.7.7。
答案 0 :(得分:2)
问题可能是类加载之一。使用DriverManager.getConnection
时,将在应用程序的上下文中创建连接,但在使用数据源时,将在应用程序服务器的上下文中创建连接,而不是当前的应用程序。因此,如果antlr-runtime在应用程序服务器本身的类路径中不可用,则生成的密钥功能不可用。
Jaybird需要antlr-runtime版本3.4,据我所知,这不是antlr 2.7.7的一部分。 antlr-complete版本4.5.2包含与antlr-runtime 3.4兼容的类(有趣的是,antlr-runtime 4.5.2没有!),所以如果这些类是你的应用程序的一部分,那么这将解释为什么它在您的应用程序中创建连接时才起作用。
要在从JNDI创建连接时使其工作,您需要将antlr-runtime添加到Jaybird的模块描述符中(作为依赖项或作为资源)。
added问题的配置(最初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"/>
。