Как решить ошибку JNDI при подключении mssql - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь подключиться к серверу Microsoft SQL с помощью метода JNDI. Мой код работает как контейнер. Подробности приведены ниже

Ниже приведен мой context.xml в разделе META-INF

<?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 голосов
/ 18 июня 2019

Если посмотреть официальную документацию Tomcat (см. Раздел Источники данных 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");

Некоторые другие Ответы переполнения стека рекомендуют также объявить ресурс в server.xml.Насколько я понимаю, это необязательно;это просто удобный способ объявить ресурсы, которые будут использоваться несколькими веб-приложениями на одном сервере.

Имейте в виду, что получение начального контекста в статическом инициализаторе несколько рискованно, особенно если вам нужно установитьContext.INITIAL_CONTEXT_FACTORY системное свойство, упомянутое выше.Вы можете попробовать передать системное свойство в качестве параметра JVM (или чего-то подобного), но, вероятно, будет хорошей идеей переместить эту часть вашего кода в «обычный» (нестатический) метод.Таким образом, при отладке у вас будет меньше проблем.

...