2017-01-07 173 views
0

Tomcat(8.5.9)的新用戶Linux CentOS 7上的Java SE 8用戶。我必須犯一個簡單的錯誤。這應該是一個教科書示例,如何爲tomcat配置JDBC連接池。將Web應用程序移植到Tomcat:javax.naming.NameNotFoundException:

我有這樣的錯誤:

javax.naming.NameNotFoundException: Name [jdbc/pool1] is not bound in this Context. Unable to find [jdbc]

任何想法,我可能做錯了嗎? Tomcat的statesIt is NOT recommended to place <Context> elements directly in the server.xml file.因此,我的設置:

$ CATALINA_HOME/webapps /下的myapp/META-INF/context.xml的如下:

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Resource name="jdbc/pool1" 
      auth="Container" 
      type="javax.sql.DataSource" 
      username="xx" 
      password="xx" 
      driverClassName="oracle.jdbc.OracleDriver" 
      url="xx" 
      maxTotal="256" 
      maxIdle="8" 
      initialSize="4" 
      removeAbandonedTimeout="7200" 
      removeAbandonedOnBorrow="true"/> 

    <Resource name="jdbc/pool2" 
      auth="Container" 
      type="javax.sql.DataSource" 
      username="xx" 
      password="xx" 
      driverClassName="oracle.jdbc.OracleDriver" 
      url="xx" 
      maxTotal="256" 
      maxIdle="8" 
      initialSize="4" 
      removeAbandonedTimeout="7200" 
      removeAbandonedOnBorrow="true"/> 

    <ResourceLink name="jdbc/pool1" 
       global="jdbc/pool1" 
       type="javax.sql.DataSource"/> 

    <ResourceLink name="jdbc/pool2" 
       global="jdbc/pool2" 
       type="javax.sql.DataSource"/> 
</Context> 

$ CATALINA_HOME/webapps /下的myapp/WEB-INF /網頁。 XML是如下:

... 
<resource-ref> 
     <description>xxx</description> 
     <res-ref-name>jdbc/pool1</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 
    <resource-ref> 
     <description>xxx</description> 
     <res-ref-name>jdbc/pool1</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
</resource-ref> 
... 

代碼導致異常:

Context context = new InitialContext(); 
DataSource ds = (DataSource)context.lookup("jdbc/pool1"); 
conn = ds.getConnection(); 

我沒有修改$ CATALINA_HOME/conf/server.xml。我是否錯誤地配置了某些東西,或者我錯過了將某個文件設置在某處?

更新1

我嘗試添加上述ResourceLinks到GlobalNamingResources標籤在$ CATALINA_HOME/conf/server.xml文件,然後停止/啓動Tomcat,但我得到了同樣的錯誤。

UPDATE 2

然後我添加的資源標記從上面的context.xml也到server.xml文件(GlobalNamingResources標籤),停止/開始的Tomcat,並得到了同樣的錯誤。

更新3

我得到的一切安德烈亞斯專家的幫助(謝謝!)通過改變Java的方式工作調用池:

Context initCtx = new InitialContext(); 
Context context = (Context) initCtx.lookup("java:comp/env"); 
DataSource ds = (DataSource) context.lookup("jdbc/pool1"); 
conn = ds.getConnection(); 

此外,ResourceLinks不應該在server.xml中(他們只是在tomcat日誌中生成警告)。

+0

什麼代碼拋出異常? – EJP

+0

@EJP當然,我添加的代碼拋出異常略高於更新1 – user46688

回答

1

您的$CATALINA_BASE/conf/server.xml文件應包含完整的<Resource>元素。請記住,還要將JDBC驅動程序jar文件添加到Tomcat的$CATALINA_BASE/lib文件夾中,因爲它是Tomcat,而不是web應用程序,在server.xml中定義<Resource>時需要它。

接下來,META-INF/context.xml是一個使用第一個時間部署web應用程序的模板。它被複制到$CATALINA_BASE/conf/Catalina/localhost/myapp.xml,並且如果更改META-INF/context.xml,可能不會更新/刷新。

.../Catalina/localhost/myapp.xml文件應包含<ResourceLink>元素,將webapp使用的名稱映射到server.xml中使用的名稱。保持這兩個名字相同是最容易的,但不是必需的。

Tomcat在WEB-INF/web.xml沒有<resource-ref>元素的情況下工作正常,但爲了與其他Servlet容器兼容,它更好。

注:$CATALINA_BASE通常是一樣的$CATALINA_HOME,即其中的Tomcat安裝,除非你明確地配置它,否則該文件夾。

所以,$CATALINA_BASE/conf/server.xml

<?xml version='1.0' encoding='utf-8'?> 
<Server ...> 
    ... 
    <GlobalNamingResources> 
     ... 
     <Resource name="jdbc/pool1" auth="Container" type="javax.sql.DataSource" ... /> 
     <Resource name="jdbc/pool2" auth="Container" type="javax.sql.DataSource" ... /> 
     ... 
    </GlobalNamingResources> 
    ... 
</Server> 

$CATALINA_BASE/conf/Catalina/localhost/myapp.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <ResourceLink name="jdbc/pool1" global="jdbc/pool1" type="javax.sql.DataSource"/> 
    <ResourceLink name="jdbc/pool2" global="jdbc/pool2" type="javax.sql.DataSource"/> 
</Context> 

並在其中放置$CATALINA_BASE/libojdbcXXX.jar

+0

感謝@Anderas,(1)'server.xml'文件中包含完整的''元素,一樣'context.xml'(2)Oracle的' ojdbc.jar'文件位於$ CATALINA_HOME/lib'文件夾中,(3)我沒有定義'$ CATALINA_BASE',所以它應該默認爲'$ CATALINA_HOME',(4)文件夾'$ CATALINA_HOME/conf/catalina/localhost',是Tomcat應該放些東西嗎? – user46688

+1

也許這已經改變了。它用來在那裏複製'META-INF/context.xml'文件,以你的情況命名爲webapp,'myapp.xml'。嘗試自己做。我從不使用'META-INF/context.xml',它總是手動配置的'conf/catalina/localhost/myapp.xml'文件,因爲它取決於如何配置'server.xml'文件。 – Andreas

+1

請記得在更改'conf'文件(包括子文件夾)時重新啓動Tomcat。 – Andreas

相關問題