Tomcat:javax.naming.NoInitialContextException

时间:2016-05-18 16:40:55

标签: java tomcat servlets connection-pooling dbcontext

我在Tomcat服务器上有一个带有Java Servlets的web服务。 在我的Servlet中,我使用这样的数据库池:

envContext = new InitialContext();
DataSource ds = (DataSource) envContext.lookup( "java:/comp/env/jdbc/Database" );
con = ds.getConnection();

对于初始化,我在我的web.xml中有这个:

<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/Database</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

然后是context.xml,它似乎是重要的步骤:

<?xml version="1.0" encoding="UTF-8"?>
 <!-- The contents of this file will be loaded for each web application -->
  <Context crossContext="true">

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

   <Resource name="jdbc/Database" auth="Container"
        type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000"
        username="user" 
        password="password" 
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/configerror_db"/>
</Context>

我读了很多其他问题来解决这个错误,但我无法解决它。

首先,我想解释一下,当我使用我的linux机器时,不会出现此错误。因此,我在Windows机器上的Eclipse中安装了相同的代码,我得到了这个上下文环境错误。

其他答案说要做this.

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, 
    "<initialContextFactory>");
env.put(Context.PROVIDER_URL, "<url>");
env.put(Context.SECURITY_PRINCIPAL, "<user>");
env.put(Context.SECURITY_CREDENTIALS, "<password>");
ctx = new InitialContext(env);

但我不知道 initialContextFactory AND ,context.xml不应该这样做吗?正如我在linux上所说的,它可以工作。

有人可以帮助我吗?我错过了什么?我不想在我使用数据库连接的每个文件中写入用户和密码。我以为是的,这真是太棒了。凭证只在context.xml中,但现在在Windows上它不起作用。

感谢您的任何建议。

3 个答案:

答案 0 :(得分:2)

嗨progNewbie,

我正在研究Windows OSEclipse IDE,特别是在您正在寻找相同类型的项目上。

您需要在以下位置更新您的代码(3-Changes)...

<强> 1。遵循Java更改,

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
......
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/Database");
conn = ds.getConnection();

<强> 2。同样配置Java Web-Application的web.xml,

......
  <resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/Database</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
......... 

第3。进入Tomcat的server.xml文件,进行以下更改:

..................
<!-- Assume my application runs on localhost... -->
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">

<Valve className=..../>

<Context docBase="...." path="..." reloadable="true" source=".....">

<!-- Assume i am using Oracle Database so that driverClass(below) Attribute's Value will be oracle.jdbc.driver.OracleDriver -->
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" 
    maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/Database" password="db-password" 
    type="javax.sql.DataSource" url="db-connection-url" username="db-user-name" 
/>

</Context>

</Host>
............

已编辑:

enter image description here

让我知道如果仍然坚持下去。

答案 1 :(得分:-1)

web.xmlcontext.xml中的配置正常。没有必要通过填写HashTable的代码来重现它。

我已成功测试了类似的实验。问题可能就像你的JNDI网址中有一个过多的斜线一样简单:试试这个:

DataSource ds = (DataSource) envContext.lookup( "java:comp/env/jdbc/Database" ); 

答案 2 :(得分:-1)

UPDATE:

  

什么是initialContextFactory及其作用?

Initial context factory

  

保存环境属性名称的常量   指定要使用的初始上下文工厂。的价值   property应该是工厂类的完全限定类名   这将创建一个初始上下文。可以在中指定此属性   传递给初始上下文构造函数的environment参数,   applet参数,系统属性或应用程序资源   文件。

如果未在任何这些来源中指定,则在完成操作需要初始上下文时会抛出NoInitialContextException

此常量的值为"java.naming.factory.initial"

有关详细信息,请执行以下操作:tutorial

服务器管理工​​作区:

当服务器管理员创建数据源时,他将其与配置为访问特定供应商数据库的Java数据库连接(JDBC)提供程序相关联。应用程序服务器要求应用程序的两个对象都可以调用该特定数据库并从中接收数据。 数据源提供的连接管理功能实际上可以在应用程序和数据库之间进行这些交换。

新创建的数据源的服务器has to be restarted可供应用程序中的Java Naming and Directory Interface (JNDI)使用。

在服务器配置中,有一个名为jndi name的选项。服务器管理员在Java Naming and Directory Interface (JNDI) name中提供输入JNDI name field。应用程序服务器使用JNDI名称将应用程序的资源引用绑定到此数据源。

注意:

  1. 不要在不同的资源类型中分配重复的JNDI名称, 例如数据源与J2C连接工厂或JMS 连接工厂。
  2. 不要为多个资源分配重复的JNDI名称 相同范围内的相同类型。
  3. 资源链接:

    Configuring a data source using the administrative console

    开发人员工作区域:

    为任何Java Web应用程序配置和运行JNDI Datasource Connection pool有三个步骤:

    • 在服务器中配置数据源并创建JNDI名称。
    • 配置web.xml
    • 使用JNDI Datasource配置您的bean
    • 在Server lib上包含JDBC驱动程序库

    数据库智能配置和代码here

    资源链接:

    1. JNDI Resources HOW-TO in Apche Tomcat 7
    2. How to configure MySQL DataSource in Tomcat 6
    3. 正如@ BalusC先生所说,

        

      异常强烈建议在Tomcat实例上禁用JNDI。

      如此启用JNDI ,您可以获得许多教程。

      可以找到有关启用JNDI的详细说明,并附上示例,here

      更多信息,您也可以查看tutorial

      资源链接:

      1. Tomcat DataSource JNDI Example