连接MSSQL时如何解决JNDI错误

时间:2019-06-16 19:32:12

标签: java jndi

我正在尝试使用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

有人可以帮助我解决问题吗?

1 个答案:

答案 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参数(或类似参数)传递,但是将代码的这一部分移至“常规”(非静态)方法可能是个好主意。这样,您在调试时就无需担心其他事情了。