gpt4 book ai didi

java - 如何解决连接mssql时JNDI错误

转载 作者:行者123 更新时间:2023-12-02 04:23:15 25 4
gpt4 key购买 nike

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

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

最佳答案

通过查看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 Stack Overflow 答案):

System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");

一些other Stack Overflow 答案建议也在 server.xml 中声明资源。据我了解,这是可选的;这只是声明将由同一服务器上的多个 Web 应用程序使用的资源的便捷方法。

请记住,在静态初始化程序中获取初始上下文有些风险,特别是如果您需要设置上面提到的 Context.INITIAL_CONTEXT_FACTORY 系统属性。您可以尝试将系统属性作为 JVM 参数(或类似的参数)传递,但将这部分代码移至“正常”(非静态)方法可能是个好主意。这样,您在调试时就可以少担心一件事。

关于java - 如何解决连接mssql时JNDI错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56622010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com