2016-03-04 2 views
1

я использовал getGeneratedKeys() с прямым вызовом класса, как это:getGeneratedKeys() не работает с JNDI в WildFly с Firebird

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: Generated keys functionality not available, most likely cause: ANTLR-Runtime not available on classpath

Я использую WildFly 10, Firebird 2.5.5, Jaybird 2 .2.9. antlr-4.5.2-complete.jar присутствует на пути построения, возможно, это не является причиной, так как он работал до изменения до пути JNDI. И wildfly несет собственный antlr 2.7.7.

ответ

1

Проблема, вероятно, относится к классу загрузки. Когда вы используете 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-полный внутри и с новым 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> 

и добавлен <module name="org.antlr4"/> в модуль Firebird.

+0

Да, это решило мою проблему. – erickdeoliveiraleal

+0

@erickdeoliveiraleal Любые возражения, если я переведу свое редактирование на свой вопрос к моему ответу? –

+0

нет, любые возражения. – erickdeoliveiraleal