2009-12-01 81 views
2

我一直在努力使JNDI數據源工作。以下指令在 http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html 我使用Tomcat5.5連接到oracle 如果我在代碼中使用直連JDBC連接,則可以很好地連接。Tomcat中JNDI數據源的問題

下面是我:我的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文件c onflicted或類似的東西,但。

任何人都可以看到任何不正確的東西嗎?

當我嘗試使用conn對象時,服務器上的錯誤指示NullPointerException。 請原諒,它首先提供:org.apache.tomcat.dbcp.dbcp.SQLNestedException:無法創建PoolableConnectionFactory(Io異常:網絡適配器無法建立連接)

回答

4

數據庫網址似乎打破了我。

嘗試:

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

謝謝。這是本地的問題。但是,當我部署到服務器時,我遇到了一個不同的問題,我將在下面指定 – mcgyver5 2009-12-01 14:15:50

+0

服務器上的問題現在是org.apache.commons.dbcp.SQLNestedException:無法創建用於連接URL的類''的JDBC驅動程序null' 其他一些線程表明我需要在我的上下文元素中設置path和docBase?無法做到這一點。 – mcgyver5 2009-12-01 14:17:56

+0

位於服務器上的oracle驅動程序jar文件在哪裏? – nos 2009-12-01 14:26:14

3

「的網絡適配器無法建立連接」

這是您的線索。它無法訪問數據庫。檢查你的服務器和端口是否正確,檢查它們是否可以從你的機器到達。

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"/> 

我不確定這種類型是否適合您的情況,我相信用戶名和密碼仍然是Resource標籤的屬性。我想指出的是屬性connectionCacheProperties。這裏是指定您指定最大和最小連接的位置。有關此屬性的更多信息,請轉至Connection Cache Properties

希望這會有所幫助。