【问题标题】:Using JDBC datasources from context.xml in TomEE在 TomEE 中使用 context.xml 中的 JDBC 数据源
【发布时间】:2013-10-15 19:30:04
【问题描述】:

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 获取数据源的代码

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

【问题讨论】:

  • 在 TomEE 网站上,他们说“任何 T​​omcat 提供的资源,比如来自 context.xml,都可以由系统中的任何托管组件查找或注入。”是真的吗?
  • 确保将context.xml 放在META-INF 文件夹中。
  • 当然是在META-INF中
  • 当然,我不是新手
  • 其实是误报。在 webapp 的 META-INF/ 文件夹中使用 context.xml 修复它。我把它放在另一个文件夹(maven 生成)中,它是src/main/resources/META-INF。正确的位置是src/main/webapp/META-INF

标签: java tomcat jdbc apache-tomee


【解决方案1】:

更新 仅针对在 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 中解决

【讨论】:

    【解决方案2】:

    您看过文档吗? http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html 另外,您能否提供您收到的例外情况?

    【讨论】:

    • 我查看了示例,但它们使用的是 tomee.xml,这与 context.xml 的语法不同
    • 这个网站提供了一个很好的例子来说明如何让这一切正常工作。我的问题多于答案,但我建议从这里开始。 mkyong.com/tomcat/how-to-configure-mysql-datasource-in-tomcat-6
    • 试试这个上下文 ctx = new InitialContext();数据源 ds = (DataSource)ctx.lookup("java:comp/env/jdbc/local_jdbc_db");
    • 上下文 ctx = new InitialContext();数据源 ds = (DataSource)ctx.lookup("java:comp/env/jdbc/local_jdbc_db");等于说 Context contextoInitial = new InitialContext();上下文 contexto = (Context) contextoInitial.lookup("java:comp/env"); DataSource ds= (DataSource) contexto.lookup("local_jdbc_db");
    【解决方案3】:

    因为我花了这么多时间来解决这个问题,我终于在阅读该主题的手册 (RTFM) 后 15 分钟内找到了答案:http://tomee.apache.org/configuring-datasources.html

    tomee.xml 中数据库资源的正确 JNDI 命名空间是:“java:openejb/Resource/...”

    把这个留在这里,以防其他人来找这个问题。

    当我本可以阅读手册时,我在这方面浪费了多少时间,我怎么强调都不过分。哦,好吧:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2013-05-07
      • 2016-12-08
      • 2015-07-25
      • 1970-01-01
      • 2011-09-09
      • 2016-01-18
      相关资源
      最近更新 更多