在 Tomcat 上部署时,java web 应用程序拒绝连接到 SQL 数据库

标签 java spring-mvc tomcat sqldatasource

所以我面临以下问题。 我开发了一个 Web 应用程序,它与 SQL Server 数据库具有以下连接。 (附数据库连接代码)

public class DBConnection
{
    private DatabaseMetaData dma;

    private static Connection con;

    private static DBConnection  instance = null;

    private static String  security = "integratedSecurity=true;";

    private DBConnection()
    {

        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
        } catch (Exception e) {
            System.out.println("Can not find the driver");
            System.out.println(e.getMessage());
        }

        try{
            con = DriverManager.getConnection("jdbc:jtds:sqlserver://<Machine>;databaseName=<DBName>; useNTLMv2=true;");
            //set autocommit
            con.setAutoCommit(true);
            dma = con.getMetaData(); // get meta data
            System.out.println("Connection to " + dma.getURL());
            System.out.println("Driver " + dma.getDriverName());
            System.out.println("Database product name " + dma.getDatabaseProductName());
        }
        catch(Exception e){

            System.out.println("Problems with the connection to the database");
            System.out.println(e.getMessage());
            System.out.println(con);
        }
    }
    public static void closeConnection()
    {
        try{
            con.close();
            System.out.println("The connection is closed");
        }
        catch (Exception e){
            System.out.println("Error trying to close the database " + e.getMessage());
        }
    }


    public  Connection getDBcon()
    {
        return con;
    }

    public static DBConnection getInstance()
    {
        if (instance == null)
        {
            instance = new DBConnection();
        }
        return instance;
    }

    public static void startTransaction()
    { try{
        con.setAutoCommit(false);
    }
    catch(Exception e){
        System.out.println("fail start transaction");
        System.out.println(e.getMessage());
    }
    }
    public static void commitTransaction()
    { try{
        con.setAutoCommit(true);
    }
    catch(Exception e){
        System.out.println("fail commit transaction");
        System.out.println(e.getMessage());
    }
    }
    public static void rollbackTransaction()
    {
        try
        {
        con.rollback();
        con.setAutoCommit(true);
        }
    catch(Exception e){
        System.out.println("fail rollback transaction");
        System.out.println(e.getMessage());
    }
    }

我在 InteliJ IDE 上使用 Tomcat 8 来运行应用程序和调试。哪个工作正常。 (数据库连接建立)

问题是,当我获取 war 文件并将其部署到同一个 Tomcat 服务器时,我没有获得任何数据库连接。 (无数据库连接) 我检查了 tomcat 和项目中的所有 .jar 文件,并添加了所有需要的文件。 似乎无法找到导致此问题的原因。也许有人遇到了同样的问题

我无法正确理解导致此问题的原因以及解决方法

**编辑:下面我添加了尝试加载数据时显示的错误

类型异常报告

消息请求处理失败;嵌套异常是 java.lang.NullPointerException

说明服务器遇到内部错误,无法完成此请求。

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException root cause

java.lang.NullPointerException com.lifeletapp.business.dataLayer.DbLogIn.isValidUser(DbLogIn.java:27) com.lifeletapp.business.HelloController.verifyLogin(HelloController.java:33) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

DbLogin 类:

public class DbLogIn implements ILogIn
{
    private Connection conn;

    public DbLogIn()
    {
        conn = DBConnection.getInstance().getDBcon();
    }

    public Staff isValidUser(String userName, String password)
    {
        Staff staff = new Staff();
        try {
            String query = "SELECT * FROM Staff WHERE userName=? AND pass=?";
            PreparedStatement preparedStatement = conn.prepareStatement( query );
            preparedStatement.setString(1, userName);
            preparedStatement.setString(2, password);
            ResultSet resultSet = preparedStatement.executeQuery();
            while( resultSet.next() ) {
                staff.setUserID(resultSet.getInt("userID"));
                staff.setfName(resultSet.getString("fName") );
                staff.setlName(resultSet.getString("lName") );
                staff.setUserName(resultSet.getString("userName") );
                staff.setPass(resultSet.getString("pass") );
                staff.setEmail(resultSet.getString("email") );
            }
            resultSet.close();
            preparedStatement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return staff;
    }
}

这更多是配置或服务器问题。不是代码问题。 如评论中所述,我已经测试过 var conn == null -> 是否为真。并且连接不会在任何地方被取消。请查看代码。然后,当从 InteliJ 调试器运行时,上面的代码再次工作。

最佳答案

所以终于弄清楚是什么问题了。 为什么它适用于我的 IDE 配置: 1. 我使用 java JDK 1.7 作为 JAVA_HOME 2. 我使用旧版本的 Tomcat 作为构建 3. 为了使用 JDTS,您需要从 .jar 存档中提取 nlmauth.dll 并将其复制到配置的 env JDK(jdk1.7-->>bin->>复制到这里)

为什么它不能在 Tomcat 服务器上运行: 1.我用的是Tomcat 8.xxx 2.Tomcat 8.xx需要JDk 8 3. 在 JDK 8 中,我没有通过 nlmauth.dll(一旦我完成了这个,一切正常)

为了解决这个问题,第一个线索是查看 tomcat 服务器日志。

据我推测,只有当您通过 Integrated Security 建立了数据库连接时,才会出现此问题。 我的推测与以下事实有关:在 tomcat 日志中,拒绝 JDBC 驱动程序的主要错误是基于集成的安全凭证。

祝大家好运。

关于在 Tomcat 上部署时,java web 应用程序拒绝连接到 SQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41694891/

相关文章:

Java/iText/Flying Saucer : Convert HTML containing svg tags to pdf

java - spring中如何将事务设置在最底层,类似jdbc?

tomcat - testacular e2e 测试和 Angular 的跨站点脚本问题

java - 如何提示在 Java/Tomcat 中下载流文件

java - 如何使用 Jackson dataformat.xml 在 java 中序列化 LookAndFeel 对象?

java - JMockit:如何设置可注入(inject)属性?

java - Spring MVC 3 JSON

apache - 没有/faces/无法访问 JSF2 应用程序

java - 迭代器返回一个对象,而不是所需的对象

java - Spring 和 Jquery