【问题标题】:trouble with JNDI Data Source in TomcatTomcat 中 JNDI 数据源的问题
【发布时间】:2010-12-22 00:32:11
【问题描述】:

我一直很难让 JNDI 数据源工作。按照说明在 http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html 我正在使用 Tomcat5.5 连接到 oracle 如果我在代码中使用直接的 JDBC 连接,我可以正常连接。

这是我所拥有的: 在我的 META-INF/context.xml 中:

<Resource name="jdbc/mydb" auth="Container"
          type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:theserver:1521/mydb"
          username="user" password="password" maxActive="20" maxIdle="10"
/>

这是 web.xml 中的内容:

<resource-ref>
  <description>please work</description>
  <res-ref-name>jdbc/mydb</res-ref-name>
    <res-type>
    javax.sql.DataSource
    </res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

代码如下:

   Connection conn = null;
    try{
    InitialContext ic = new InitialContext();
    DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/mydb");
    conn = ds.getConnection();
    } catch ....... etc.

我尝试了许多不同的配置并开始了一个新的简单项目,以确保没有额外的 jar 文件发生冲突或类似的事情,但是。

任何人都可以看到任何看起来不正确的东西吗?

当我尝试使用 conn 对象时,服务器上的错误指示 NullPointerException。 对不起,它首先提供:org.apache.tomcat.dbcp.dbcp.SQLNestedException:无法创建 PoolableConnectionFactory(Io 异常:网络适配器无法建立连接)

【问题讨论】:

    标签: java tomcat datasource jndi


    【解决方案1】:

    我正在回复塞巴斯蒂安回答中的 cmets。

    当我看到 org.apache.commons.dbcp 时,这意味着 Tomcat 正在使用内置的 Apache Commons Database Connection Pooling 库而不是 Oracle JDBC 驱动程序中的库。

    Oracle JDBC 驱动程序不在公共目录中通常是我尝试解决的第一个问题。看来这不是你的问题。

    其次,当应用程序启动时,如果在创建 JNDI 数据源时出现问题,Tomcat 可能会使用 Commons 库。这可能是您的情况,因为您的数据库 URL 错误。在不停止并重新启动 Tomcat 的情况下,更正 conf/Catalina/localhost 目录中的 context.xml 或复制/重命名的文件可能无法解决问题。所以,我建议停止并重新启动 Tomcat,看看这是否能解决问题。

    最后一点,您提供的链接用于设置 Common 的库。我花了一段时间才弄清楚这一点。下面是我的 JNDI Oracle 数据源定义之一的示例。

      <Resource auth="Container" name="jdbc/mydb" 
        type="oracle.jdbc.xa.client.OracleXADataSource"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        factory="oracle.jdbc.pool.OracleDataSourceFactory"
        url="jdbc:oracle:thin:@theserver:1521:mydb" 
        connectionCachingEnabled="true"
        connectionCacheProperties="{InactivityTimeout=1800,PropertyCheckInterval=300,MaxStatementsLimit=125,ValidateConnection=true}"
        implicitCachingEnabled="true"/>
    

    我不确定类型在您的情况下是否重要,我相信用户和密码仍然是 Resource 标签的属性。我要指出的是属性connectionCacheProperties。在此处指定您指定最大和最小连接的位置。转至Connection Cache Properties 了解有关此属性的更多信息。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      “网络适配器无法建立连接”

      这是你的线索。它无法访问数据库。检查您的服务器和端口是否正确,检查它们是否可以从您的机器访问。

      【讨论】:

        【解决方案3】:

        对我来说,数据库 url 似乎坏了。

        尝试:

        jdbc:oracle:thin:@theserver:1521/mydb
        

        【讨论】:

        • 谢谢。这是当地的问题。但是,当我部署到服务器时,我会遇到一个不同的问题,我将在下面指定
        • 服务器上的问题现在是 org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' 一些其他线程表明我需要设置路径和 docBase在我的上下文元素中?做不到。
        • oracle驱动jar文件放在服务器哪里?
        • 不,它在 TOMCAT_HOME/common/lib 中。嗯。它也在 TOMCAT_HOME/webapps/MyTestApp/WEB-INF/lib
        • 对,Tomcat 在部署时将 META-INF/context.xml 从 .war 文件复制到 /catalina/yourhost/yourapp.xml,如果它已经存在,它不会覆盖它,它会保留旧文件。因此,为了彻底取消部署,您必须从 /catalina/yourhost/ 中删除 .war 文件、展开的 .war 文件目录和上下文配置文件。我认为当您从 tomcat 管理器应用程序中取消部署应用程序时,所有这些步骤都会自动为您完成。
        猜你喜欢
        • 2019-04-10
        • 2012-04-30
        • 1970-01-01
        • 2012-11-23
        • 1970-01-01
        • 2011-02-24
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多