当前位置: 首页 > 知识库问答 >
问题:

OpenJDK1.8 on Ubuntu打开到Windows MSSQL server的JDBC连接时出错

穆景辉
2023-03-14

我在Ubuntu上的OpenJDK1.8中使用如下所示的JDBC来尝试连接到运行在本地B类LAN上的远程Windows服务器上的MSSQL服务器实例:

public static DataSource getMsSqlPoolSource(String server, String database, String user, String password) throws ClassNotFoundException {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

        String connectionString = "jdbc:sqlserver://" + server + ";databaseName=" + database + ";sendStringParametersAsUnicode=false;";
        System.out.println("Connection String for MSSQL is:: " + connectionString);     
        org.apache.commons.dbcp2.ConnectionFactory factory = new DriverManagerConnectionFactory(connectionString, user, password);
        PoolableConnectionFactory poolFactory = new PoolableConnectionFactory(factory, null);
        ObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(poolFactory);
        poolFactory.setPool(connectionPool);
        PoolingDataSource<PoolableConnection> dataSource = new PoolingDataSource<>(connectionPool);
        return dataSource;
    }
java.sql.SQLException: invalid database address: jdbc:sqlserver://172.17.12.14;databaseName=DB;sendStringParametersAsUnicode=false;
        at org.sqlite.JDBC.createConnection(JDBC.java:111) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at org.sqlite.JDBC.connect(JDBC.java:88) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at java.sql.DriverManager.getConnection(DriverManager.java:664) ~[?:1.8.0_292]
        at java.sql.DriverManager.getConnection(DriverManager.java:247) ~[?:1.8.0_292]
        at org.apache.commons.dbcp2.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:90) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at org.apache.commons.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:291) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:883) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:436) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:365) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at verishare.db.SqlDataHelper.ExecuteQuery(SqlDataHelper.java:66) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at verishare.db.SqlDataHelper.ExecuteQuery(SqlDataHelper.java:59) ~[verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at verishare.verdial_db.KeepVNEmpSyncedToVDAgent.updateEmployeesFromVeriNet(KeepVNEmpSyncedToVDAgent.java:284) [verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at verishare.verdial_db.KeepVNEmpSyncedToVDAgent.run(KeepVNEmpSyncedToVDAgent.java:58) [verdi-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_292]

如果我在MSSQL studio上使用MSSQL用户名、MSSQL密码和数据库,它们允许我使用MSSQL studio登录和访问MSSQL服务器实例。

我没有得到任何错误除了

java.sql.SQLException: invalid database address:jdbc:sqlserver://172.17.12.14;databaseName=DB;sendStringParametersAsUnicode=false;

有人知道为什么上面的地址现在在JDBC驱动程序中是一个无效的数据库地址吗?

        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>6.4.0.jre8</version>
            <scope>test</scope>
        </dependency>

编辑:MSSQL服务器的日志显示没有失败的登录(例如,如果我故意在MSSQL studio中输入错误的密码,它确实登录到MSSQL服务器的日志中。所以我的连接尝试--即使wireshark向外显示MSSQL的流量和回复)似乎没有达到MSSQL中失败的连接尝试被记录的水平...)

编辑:好的,我删除了SQLLite POM工件,现在我得到了一个不同的错误-似乎我现在使用了正确的驱动程序,关闭,但没有雪茄:

Connection String for MSSQL is:: jdbc:sqlserver://172.17.12.14;databaseName=DB;sendStringParametersAsUnicode=false;
Error On Verinet MSSQL The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "The server selected protocol version TLS10 is not accepted by client preferences [TLS12]". ClientConnectionId:3b85afc0-3e6d-4cad-bf16-bedb9f70241c

共有1个答案

暴骏奇
2023-03-14

在Mark Rotteveel和AlwaysLearning的善意帮助下,这个问题得到了解决。

问题有三个方面。

首先,在我的Netbeans 11项目中,在“Dependencies”文件夹中,我有一个名为

这就是为什么我总是

java.sql.SQLException: invalid database address:jdbc:sqlserver://172.17.12.14;databaseName=DB;sendStringParametersAsUnicode=false;

当然,SQLLite连接协议永远不会在MSSQL服务器上工作...

第三,连接尝试到MSSQL时的异常更改为引用这样一个事实,MSSQL服务器对连接使用了太旧的TLS加密,而我的客户机在JDBC端拒绝了这一点--参见上面。Mark Rotteveel随后协助编辑该文件

/etc/java-8-openjdk/security/java.security
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

这是因为MSSQL JDBC驱动程序现在使用“真正的”MSSQL协议试图从我的Ubuntu机器连接到MSSQL服务器,而不是尝试使用SQLLite协议连接到MSSQL服务器,并且在更改java.security之后,JDBC驱动程序被允许使用“足够老的”TLS版本与MSSQL服务器进行对话。

希望这能帮助别人。

 类似资料:
  • 我正在尝试打开到Google Cloud Spanner数据库的JDBC连接,但我得到以下错误消息: IllegalArgumentException:此服务需要一个项目ID,但无法从构建器或环境中确定。请使用生成器设置项目ID。 我的JDBC URL如下: 如果从URL中删除属性,则会出现以下异常: java.sql.SqlNonTransientConnectionException:[Sim

  • 当应用程序尝试打开与硬件HSM的连接时,收到CKR\U GENERAL\U错误。 详细的错误是: 有人能告诉我这个错误的原因吗?该应用程序与软件HSM配合良好。 H/W HSM详细信息: ProtectToolkit C密钥管理实用程序:4.2.0(甚至在4.3.0中试用过) 制造商:Eracom 硬件版本:66.00 固件版本:2.02

  • 我的spring bean出现以下错误, EmployeeService.java config.xml

  • 在线程“main”java.sql.sqlexception:在java.sql.drivermanager.getconnection(未知源)在java.sql.drivermanager.getconnection(未知源)在com.test.readalltables.main(readalltables.java:18)找不到适合JDBC的驱动程序:as400:/192.168.1.11

  • 我得到一个连接不打开发送()错误后立即连接到一个万花筒节点的网络套接字。我试图从web3js版本1.0.0-beta.34使用WebSocketProvider。 我的连接代码看起来像这样,其中,和是带有Kaleido节点信息的局部变量。 我已经尝试了Github问题中列出的建议步骤——在连接丢失时尝试重新连接,但错误仍然存在。我认为这可能是一个Kaleido问题,因为我可以使用Websocket