我正在尝试使用JNDI方法连接Microsoft sql服务器。我的代码作为容器运行。详细信息如下
下面是我在META-INF下的context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/CIBILDB"
auth="Container"
type="javax.sql.DataSource"
validationQuery="SELECT 1"
validationInterval="30000"
maxActive="100"
minIdle="10"
maxWait="10000"
initialSize="10"
jmxEnabled="true"
username="automationrobot"
password="Soft2007"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://TGSLAP-2154\\SQLEXPRESS:1433"/>
</Context>
下面是我的Java代码
package com.CIBIL.dao;
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 InitialiseCIBILDBConnection {
private static DataSource dataSource;
private static final String JNDI_LOOKUP_SERVICE = "java:/comp/env/jdbc/CIBILDB";
static{
try {
Context context = new InitialContext();
Object lookup = context.lookup(JNDI_LOOKUP_SERVICE);
if(lookup != null){
dataSource =(DataSource)lookup;
}else{
new RuntimeException("JNDI look up issue.");
}
} catch (NamingException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
使用上面的代码时,出现错误
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
有人可以帮助我解决问题吗?
答案 0 :(得分:0)
通过查看官方的Tomcat documentation(请参阅标题为 JDBC数据源的部分),似乎您还需要在/WEB-INF/web.xml
文件中声明资源,例如所以:
<resource-ref>
<description>
Resource reference to a factory for java.sql.Connection
instances that may be used for talking to a particular
database that is configured in the <Context>
configuration for the web application.
</description>
<res-ref-name>jdbc/CIBILDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
如果这不起作用,请尝试将初始上下文工厂设置为系统属性(来自this堆栈溢出答案):
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
一些other堆栈溢出答案也建议在server.xml
中声明资源。据我了解,这是可选的;这是声明将由同一服务器上的多个Web应用程序使用的资源的便捷方法。
请记住,在静态初始化程序中获取初始上下文有些冒险,尤其是在需要设置上述Context.INITIAL_CONTEXT_FACTORY
系统属性的情况下。您可以尝试将系统属性作为JVM参数(或类似参数)传递,但是将代码的这一部分移至“常规”(非静态)方法可能是个好主意。这样,您在调试时就无需担心其他事情了。