2013-05-13 21 views
0

对于我的项目,我想使用Tomcat的连接使用JNDI池为Oracle数据库和获取异常在执行下面的代码Oracle数据库:Tomcat的连接如集中使用JNDI的

这是我收到的例外:

javax.naming.NameNotFoundException: Name java: is not bound in this Context 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:803) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:159) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at com.iton.dbcp.DBUtil.getConnection(DBUtil.java:28) 
    at com.iton.dbcp.TestServlet.doGet(TestServlet.java:35) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl 
    icationFilterChain.java:252) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF 
    ilterChain.java:173) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV 
alve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV 
alve.java:178) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j 
ava:126) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j 
ava:105) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal 
ve.java:107) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav 
a:148) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java 
:869) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.p 
rocessConnection(Http11BaseProtocol.java:664) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpo 
    int.java:527) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFol 
    lowerWorkerThread.java:80) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP 
ool.java:684) 
    at java.lang.Thread.run(Thread.java:662) 

这些是我使用的连接池的文件

我置于/conf/server.xml以下配置:

<Resource name="jdbc/pooldb" auth="Container" type="javax.sql.DataSource" 
maxActive="5" maxIdle="2" maxWait="1000"       factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      driverClassName="oracle.jdbc.driver.OracleDriver" 
      url="jdbc:oracle:thin:@localhost:1521:pooldb"/> 

DBUtil1.java:

package com.iton.dbcp; 

import java.sql.Connection; 
import java.sql.SQLException; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.sql.DataSource; 

public class DBUtil1 { 

public static Connection getConnection() throws NamingException, SQLException { 

    Context initContext = new InitialContext(); 
    Context envContext = (Context) initContext.lookup("java:/comp/env"); 
    DataSource ds = null; 
    Connection conn = null; 
    try { 
     ds = (DataSource) envContext.lookup("jdbc/pooldb"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if (envContext == null) { 
     System.out.println("envcontext is null"); 
    } 
    if (ds == null) { 
     System.out.println("datasource is null"); 
    } 
    if (ds != null){ 
     conn = ds.getConnection("pooldb","pooldb"); 
    } 
    return conn; 
} 
} 

TestServlet.java:

package com.iton.dbcp; 

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.SQLException; 
import java.sql.Statement; 

import javax.naming.NamingException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


public class TestServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 

/** 
* @see HttpServlet#HttpServlet() 
*/ 
public TestServlet() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException { 

    Connection con = null; 
    try { 
     con = DBUtil.getConnection(); 
     System.out.println("opened conncetion:::::::::: "+con); 
     Statement stmt = con.createStatement(); 
     stmt.executeUpdate("create table iton(sno varchar(10), name varchar(10))"); 
     stmt.close(); 
     DBUtil.closeConncetion(con); 
     System.out.println("Closeddddddddddddddd: "+con); 

    } catch (NamingException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    } 

的web.xml: http://java.sun.com/xml/ns/javaee/web- app_2_5.xsd” ID = “WebApp_ID” 版本= “2.5”> TestApp

<description>Oracle Test App</description> 
<resource-ref> 
<description>Oracle Datasource example</description> 
<res-ref-name>jdbc/pooldb</res-ref-name> 
<res-type>javax.sql.DataSource</res-type> 
<res-auth>Container</res-auth> 
</resource-ref> 
<servlet> 
<servlet-name>abscd</servlet-name> 
<servlet-class>com.iton.dbcp.TestServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>abscd</servlet-name> 
<url-pattern>/*</url-pattern> 
</servlet-mapping> 

</web-app> 

在/conf/context.xml:

<!-- The contents of this file will be loaded for each web application --> 
<Context> 

<!-- Default set of monitored resources --> 
<WatchedResource>WEB-INF/web.xml</WatchedResource> 

<!-- Uncomment this to disable session persistence across Tomcat restarts --> 
<!-- 
<Manager pathname="" /> 
--> 

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

请解决此问题

回答

0

此错误:

Context envContext = (Context) initContext.lookup("java:/comp/env"); // INCORRECT

问::

javax.naming.NameNotFoundException: Name java: is not bound in this Context

由该行造成的,如果你改变,会发生什么你代码为initContext.lookup("java:comp/env");

问:你有没有可能无意中改变了默认环境?

此链接可能帮助:

What does java:comp/env/ do?

确保useNaming是 “真”:

http://tomcat.apache.org/tomcat-5.5-doc/catalina/funcspecs/fs-admin-objects.html

最后,

Changing embedded Tomcat from v6 to v7 causes InitialContext lookup to fail

http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

0

我认为你缺少你的server.xml条目。 首先,您需要在Tomcat中为资源声明添加一个声明到server.xml文件,该文件驻留在Tomcat安装的/ conf目录中。

输入您的应用程序指定值。

<Resource name="jdbc/your datasource" auth="Container" 
    type="javax.sql.DataSource" removeAbandoned="true" 
    removeAbandonedTimeout="30" maxActive="100" 
    maxIdle="30" maxWait="10000" username="" 
    password="" 
    driverClassName="oracle driver" 
    url="database connection string"/> 

</Context> 
1
Context envContext = (Context) initContext.lookup("java:/comp/env"); 

应该是:

Context envContext = (Context) initContext.lookup("java:comp/env"); 

Java环境背景是用java:comp/env的。删除/ comp之前,你应该很好去。

+0

Thaks for ur reply我删除了斜线(/),但它不起作用 – 2013-05-13 10:19:19