Tomcat中的JNDI数据源出现问题

时间:2009-12-01 13:26:01

标签: java tomcat datasource jndi

我一直很难让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异常:网络适配器无法建立连接)

3 个答案:

答案 0 :(得分:4)

数据库网址似乎对我不了解。

尝试:

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

当我看到org.apache.commons.dbcp时,它意味着Tomcat使用内置的Apache Commons数据库连接池库而不是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"/>

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

希望这有帮助。