代码之家  ›  专栏  ›  技术社区  ›  mcgyver5 Ravi Kant

Tomcat中的JNDI数据源故障

  •  2
  • mcgyver5 Ravi Kant  · 技术社区  · 15 年前

    我一直很难让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:无法创建可合并连接工厂(IO异常:网络适配器无法建立连接)

    3 回复  |  直到 10 年前
        1
  •  4
  •   Sylar    15 年前

    数据库URL在我看来已损坏。

    尝试:

    jdbc:oracle:thin:@theserver:1521/mydb
    
        2
  •  3
  •   Sean Owen    15 年前

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

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

        3
  •  2
  •   prof401    15 年前

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

    当我看到org.apache.commons.dbcp时,这意味着Tomcat使用的是内置的apache commons数据库连接池库,而不是OracleJDBC驱动程序中的库。

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

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

    最后一个注意事项是,您提供的链接用于设置公共库。我花了一段时间才弄明白。下面是我的一个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"/>
    

    我不确定在您的情况下类型是否重要,我相信用户和密码仍然是资源标记的属性。我要指出的是属性connectioncacheproperties。这里是指定您指定最大和最小连接的地方。去 Connection Cache Properties 有关此属性的详细信息。

    希望这有帮助。

    推荐文章