我在Tomcat服务器上有一个带有Java的with服务。在我的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中的相同代码,我得到了这个上下文环境错误。
其他答案说要做这。
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是什么,和难道不应该这样做吗?正如我在linux上所说的,它可以工作。
有人能帮我一下吗?我遗漏了什么?我不想在我使用数据库连接的每个文件中写入用户和密码。我以为这太棒了。凭据只是在context.xml中,但是现在它在窗口上不起作用。
谢谢你的建议。
发布于 2016-06-02 11:03:42
嗨,progNewbie,
我正在Windows OS
和Eclipse IDE
上工作,特别是在您正在寻找的相同类型的项目上。
您需要在以下地方更新您的代码(3-更改).
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.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>
............
编辑:
那就告诉我如果还活着的话。
发布于 2016-05-18 17:11:23
您在web.xml
和context.xml
中的配置是可以的。不需要通过填充HashTable之类的代码来再现它。
我已经成功地测试了类似的实验。问题可能很简单,因为您的JNDI url中有太多的斜杠:尝试如下:
DataSource ds = (DataSource) envContext.lookup( "java:comp/env/jdbc/Database" );
发布于 2016-06-01 09:00:49
更新:
initialContextFactory是什么?它是做什么的?
初始上下文工厂
用于指定要使用的初始上下文工厂的环境属性名称的常量。属性的值应该是将创建初始上下文的工厂类的完全限定类名。可以在传递给初始上下文构造函数、applet参数、系统属性或应用程序资源文件的环境参数中指定此属性。
如果这些源中没有指定NoInitialContextException
,则在完成操作所需的初始上下文时抛出 。
这个常量的值是"java.naming.factory.initial"
。
有关更多细节:您可以跟踪这个教程。
服务器管理工作区:
当服务器管理员创建数据源时,他将其与配置为访问特定供应商数据库的(JDBC)提供程序相关联。应用服务器需要应用程序的两个对象来调用该特定数据库并从它接收数据。数据源提供了连接管理功能,从而使您的应用程序和数据库之间的这些交换成为可能。
新创建的数据源的服务器has to be restarted
可用于来自应用程序的Java Naming and Directory Interface (JNDI)
。
在服务器配置中,有一个名为jndi name
的选项。服务器管理员在JNDI name field
中提供输入JNDI name field
。应用服务器使用JNDI名称将应用程序的资源引用绑定到此数据源。
注意:
资源链接:
发展商工作区:
有三个步骤可以为任何Java应用程序配置和运行JNDI Datasource Connection pool
:
数据库的配置和代码给出了这里。
资源链接:
正如@BalusC先生所说,
异常强烈表示在Tomcat实例上禁用了JNDI。
因此,用于启用JNDI,您可以获得许多教程。
对于启用JNDI过程中发生的事情有一个更详细的解释,包括一个示例,可以找到这里。
要了解更多信息,您也可以通过这个教程。
资源链接:
https://stackoverflow.com/questions/37305545
复制相似问题