4

Tomcat 7 で接続プールを構成しようとしています。コードは次のとおりです: server.xml の一部:

<GlobalNamingResources>
<!-- Editable user database that can also be used by
     UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
          type="org.apache.catalina.UserDatabase"
          description="User database that can be updated and saved"
          factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname="conf/tomcat-users.xml" />


<Resource  
name="jdbc/testDataSource"                                  
auth="Container"                                            
type="javax.sql.DataSource"                                   
driverClassName="com.mysql.jdbc.Driver"                      
url="jdbc:mysql://localhost:3306/delta_server"                
username="test" password="test"                              
validationQuery="select count (*) from session_contexts"              
/>

web.xml 構成:

<resource-ref> 
    <description> 
        Sample JNDI DataSource resource reference 
    </description> 
    <res-ref-name>jdbc/testDataSource</res-ref-name>                   
    <res-type>java.sql.DatSource</res-type>                           
    <res-auth>Container</res-auth>                                     
</resource-ref> 

そしてjspページからアクセスします:

        Context initialContext = new InitialContext();
        Context envContext = (Context) initialContext.lookup("java:/comp/env");
        conn = (Connection)  envContext.lookup("jdbc/testDataSource");

しかし、残念ながら例外が発生します:

javax.naming.NamingException: Cannot create resource instance
org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:146)
javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
org.apache.naming.NamingContext.lookup(NamingContext.java:826)
org.apache.naming.NamingContext.lookup(NamingContext.java:145)
org.apache.naming.NamingContext.lookup(NamingContext.java:814)
org.apache.naming.NamingContext.lookup(NamingContext.java:159)
org.apache.jsp.index_jsp._jspService(index_jsp.java:91)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

どうすれば修正できますか?ありがとうございました。

4

1 に答える 1

4

構成はほとんど問題ないように見えます (web.xmlファイル内のいくつかのタイプミスを除いて; である<res-type>java.sql.DatSource</res-type>必要があります<res-type>javax.sql.DataSource</res-type>)。

しかし、私が思うに問題は、server.xmlファイル内でデータベース リソースを宣言しているという事実です。

通常、アプリケーション リソースはアプリケーションのcontext.xmlファイルで宣言する必要があり、アプリケーションserver.xml間で共有する場合にのみ宣言する必要があります。したがって、私の提案は、ファイルでjdbc/testDataSourceリソースを宣言することです。context.xmlそれはそれを機能させる1つの方法です。

絶対にグローバル リソースが必要な場合は、context.xmlファイルにリソース リンクを追加する必要があります。そうしないと、デフォルトでは表示されません

このコンテキストは、JNDI Resources HOW-TO で説明されている Web アプリケーションごとの JNDI コンテキストとは異なります。この要素で定義されたリソースは、<ResourceLink> 要素で明示的にリンクしない限り、Web アプリケーションごとのコンテキストでは表示されません。

したがって、それを機能させる2番目の方法は、リソースを宣言したままにして、ファイルに次server.xmlのようなものを追加することです。context.xml

<ResourceLink global="jdbc/testDataSource" 
              name="jdbc/testDataSource" 
              type="javax.sql.DataSource" />
于 2012-07-22T20:04:04.033 に答える