0

对于我的项目,我想使用 jndi 为 oracle DB 使用 tomcat 连接池,并在执行以下代码时出现异常:

这是我得到的例外:

  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" version="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>

请解决这个问题

4

3 回答 3

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

应该:

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

Java 环境上下文是 java:comp/env。在 comp 之前删除 / ,你应该很高兴。

于 2013-05-13T06:23:43.330 回答
0

这个错误:

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

是由这一行引起的:

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

问:如果您将代码更改为 会发生什么initContext.lookup("java:comp/env");

问:您是否有可能无意中更改了默认上下文?

此链接可能会有所帮助:

java:comp/env/ 做什么?

确保 useNaming 为“true”:

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

最后,

将嵌入式 Tomcat 从 v6 更改为 v7 会导致 InitialContext 查找失败

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

于 2013-05-13T06:15:16.983 回答
0

我认为您缺少 server.xml 条目。首先,您需要在 Tomcat 中配置 JNDI 数据源,方法是将资源声明添加到 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>
于 2013-05-13T06:18:51.500 回答