java - 在 TomEE 中使用来自 context.xml 的 JDBC 数据源

标签 java tomcat jdbc apache-tomee

TomEE 是一个很棒的项目,它结合了 Tomcat 的轻量级体验和 Java EE 的特性。我在 context.xml 中声明了许多 JDBC 数据源,但是当我想通过 JNDI 使用该数据源时,我得到了一个异常。那么我怎样才能在 TomEE 中使用在 context.xml 中声明的 JDBC 数据源

我的数据源在 context.xml 中声明

 <Resource auth="Container" 
        name="local_jdbc_db"  
        type="javax.sql.DataSource" 
        driverClassName="com.mysql.jdbc.Driver"  
        url="jdbc:mysql://localhost:3306/mydb" 
        username="user" 
        password="pass"      /> 

从JNDI获取Datasource的代码

Context contextoInicial = new InitialContext();
Context contexto = (Context) contextoInicial.lookup("java:comp/env");
DataSource ds= (DataSource) contexto.lookup("local_jdbc_db");

最佳答案

更新 只对那些在 TomEE 中遇到这种罕见问题的人说:我尝试在 context.xml 中创建数据源并在 TomEE JAX-RS 版本 1.5.0 中部署但没有成功,它总是抛出空指针异常和找不到数据源名称。最近我对 TomEE JAX-RS 版本 1.6.0 进行了相同的尝试:我在 context.xml 中创建了我的数据源,并使用这段代码创建了一个简单的 servlet

     Context initContext = new InitialContext();
     Context envContext = (Context) initContext.lookup("java:/comp/env");
     DataSource dataSource = (DataSource) envContext.lookup("jdbc_northwind");
     try (Connection conn = dataSource.getConnection(); 
           Statement s = conn.createStatement();
           ResultSet rs = s.executeQuery("select * from customers")) {
           while (rs.next()) {
                out.print(rs.getString("CompanyName"));
                out.print("<br>");
           }         
       } 

... 启动服务器,万岁!!!!它显示了结果!,但我有点失望,因为当我重新部署应用程序时,它显示了旧的异常(未找到数据源,空指针异常)所以我尝试了最后一件事:在 web.xml 中注册数据源

  <resource-ref>
        <res-ref-name>jdbc_northwind</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref> 

然后重新启动服务器并... 它可以工作,重新部署应用程序并且工作得很好!但是这种行为很奇怪:在 Tomcat 中我从未在 web.xml 中声明我的数据源并且我对数据源没有任何问题。也许是一个错误?

更新:已确认是一个错误,似乎会在 TomEE 1.6.1 中解决 更新 2:在 TomEE 1.7.0 中解决

关于java - 在 TomEE 中使用来自 context.xml 的 JDBC 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19389474/

相关文章:

java - 我可以将应用程序热部署到 Tomcat 中吗?

java - 如何使用 JDBCTemplate 使线程尝试重新连接到数据库 x 次

java - 从控制台读取时 CPU 使用率高

java - 为什么 Tomcat7 中有 el-api.jar 而没有 jSTL 库?

java - 关闭 "error"关于在 Eclipse 中缺少无参数构造函数

java - 部署到远程Tomcat时如何修复 'nested exception is org.hibernate.exception.JDBCConnectionException'?

java - xe :beanNamePicker, 无法将我的值从注释 View 获取到结果集中

Apache,catalina一直在说stackoverflow

java - 动态数据源作为 Spring Boot + Hibernate 中的第二个数据源

mysql - 使用 JPA 在数据库中插入符号时出错