无法将 Glassfish 5.1.0 上的 Java 8 (291) Web 应用程序连接到 SQL Server 2014 实例

问题描述

我有一个在 Java 6、Glassfish 4.1、sql Server 2012、Nebeans 8 下运行的 JSF Web 应用程序,但我在 Java 8、Glassfish 5.1.0、sql Server 2014、Netbeans 12 下收到错误。它有所不同,但通常是握手、套接字或找不到类(重点是 servlet)。

握手错误

java.lang.NoClassDefFoundError: sun/security/ssl/HandshakeStateManager
    at sun.security.ssl.Handshaker.init(Handshaker.java:282)
    at sun.security.ssl.Handshaker.<init>(Handshaker.java:242)
    at sun.security.ssl.ClientHandshaker.<init>(ClientHandshaker.java:160)
    at sun.security.ssl.SSLSocketImpl.initHandshaker(SSLSocketImpl.java:1297)
    at sun.security.ssl.SSLSocketImpl.doneConnect(SSLSocketImpl.java:671)
    at sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:551)
    at sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:110)
    at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1606)
    at com.microsoft.sqlserver.jdbc.sqlServerConnection.connectHelper(sqlServerConnection.java:1324)
    at com.microsoft.sqlserver.jdbc.sqlServerConnection.login(sqlServerConnection.java:992)
    at com.microsoft.sqlserver.jdbc.sqlServerConnection.connect(sqlServerConnection.java:828)
    at com.microsoft.sqlserver.jdbc.sqlServerDriver.connect(sqlServerDriver.java:1012)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at Database.DAO.openConnection(DAO.java:48)

一切都在同一台机器上,我试过没有打开防火墙,所以我不相信这是端口问题,尽管 glassfish 服务器日志说它已连接但端口在某些配置下关闭

>

我也尝试过 Payara 并在那里遇到了失败。

代码看起来很简单,所以很可能是配置/库问题,但我一直没能解决

public Connection openConnection(){
        //This try/catch should not be necessary,but the driver is not found here
        try{
            Class.forName(dbi.getDriver());
        }catch (ClassNotFoundException e){
                System.out.println("Could not load the driver");
        }
        
        try{
            connect = DriverManager.getConnection((dbi.getUrl()+dbi.getdbname()),dbi.getDbUsername(),dbi.getDbPassword());
        }catch(Exception e){
            e.printstacktrace();  //Point of failure: connect is null
        }
        
        return connect;
    }

public DbInfo(){
        driver      = "com.microsoft.sqlserver.jdbc.sqlServerDriver";
        url         = "jdbc:sqlserver://localhost";
        dbname      = ";DatabaseName=Test";
        dbUsername  = "user";
        dbPassword  = "pass";
    }

解决方法

这不是一个很好的答案,但如果有疑问,那就放弃一切,然后重新开始。

我删除并移除了 ODBC 驱动程序、SSMS、Netbeans 和 Glassfish,并重新安装了每个组件。我确保防火墙在 TCP/UDP 1433-1434 上打开,并且所有 SQL Server 服务都在运行。

我确保 ODBC 驱动程序在建议的 Program Files 目录中可用。 我确保启用 SQL Server 和 Windows 授权,启用 sa 登录,允许远程连接。

我复制了已安装的 ODBC 驱动程序 sqljdbc42.jar 以使其可用于项目。我最大限度地减少了每个项目引用的 jar 数量,并包含了 Java 8 API 和 Java 8 Web API 库。

我从 Glassfish 的 grzzly jar 中删除了 sun 文件夹。

在问题项目开始工作之前,我清理、构建和部署了每个项目。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...