最近忙實(shí)習(xí),宅在國(guó)內(nèi)遠(yuǎn)程辦公,然后呢我的西班牙老板又要求我用Java做某個(gè)管理系統(tǒng)。由于我的電腦和公司的遠(yuǎn)程電腦上都裝的是SQL Server 2019,為了圖方便,我就沒有換數(shù)據(jù)庫(kù)系統(tǒng)軟件,順便隨手建了個(gè)庫(kù)建了個(gè)表來測(cè)試一下。
表大概長(zhǎng)這么一個(gè)樣子:
?插入了一些數(shù)據(jù):
用戶建好了,也授予了對(duì)應(yīng)權(quán)限,于是就開始編寫Java代碼連接和簡(jiǎn)單的查詢了:
package com.ernesto;
import java.sql.*;
public class Main {
public static void main(String[] args) {
String drvName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL = "jdbc:sqlserver://localhost:1433;DatabaseName=StudentManagement";
String userName = "JavaExp";
String userPwd = "123";
Connection dbc;
try {
Class.forName(drvName); // load microsoft's jdbc driver
DriverManager.setLoginTimeout(2);
dbc = DriverManager.getConnection(dbURL, userName, userPwd);
System.out.println("Connection successfully!");
Statement stm = dbc.createStatement();
ResultSet rs = stm.executeQuery("SELECT Sno, Sname FROM t_Student ORDER BY Sno DESC");
while(rs.next()) {
System.out.println("Student Number: " + rs.getString("Sno")
+ "\tStudent Name: " + rs.getString("Sname"));
}
stm.close();
dbc.close(); // Should disconnect
} catch (Exception e) {
e.printStackTrace();
}
}
}
順便提一下,JDBC驅(qū)動(dòng)我用的是微軟最新的11.2.1版本,適用于JRE 11的。這個(gè)可以直接在項(xiàng)目的build.gradle里面配置,省得去微軟官網(wǎng)下載JAR再導(dǎo)入Eclipse,很麻煩。示例:
dependencies {
implementation 'com.microsoft.sqlserver:mssql-jdbc:11.2.1.jre11'
// ...
}
但執(zhí)行的時(shí)候,就出大問題了。
首先是連接不上去,這坨西班牙文的大概意思就是說連接超時(shí)被拒絕了:
而且里面有個(gè)很關(guān)鍵的提示,就是這個(gè)數(shù)據(jù)庫(kù)連接采用的是TCP/IP協(xié)議,然后想了一下1433端口是不是telnet不通,后來一試果然不行。
所以馬上就去查SQL Server的配置管理器,依次展開SQLSERVER網(wǎng)絡(luò)配置-SQLINSTANCE的協(xié)議,一看TCP/IP協(xié)議確實(shí)是被禁用了。既然都禁用了,那還連得上個(gè)鬼,于是馬上啟用:
?然后還要檢查是不是開的1433端口,一看居然開的是動(dòng)態(tài)端口,那必須得改!馬上改成固定的1433端口:
?最后記得要重啟數(shù)據(jù)庫(kù)服務(wù)器,在SSMS里面直接在服務(wù)實(shí)例上右鍵菜單點(diǎn)擊重啟就好了:
?好,重啟了,再連接,接下來又報(bào)錯(cuò),說是SSL證書有問題:
網(wǎng)上搜了一大堆方案,很多人要么說是缺一個(gè)安全憑證jssecacerts證書文件需要生成,要么說是要升級(jí)sql支持TLS1.2,還有各種打補(bǔ)丁改注冊(cè)表的。這些我統(tǒng)統(tǒng)都試了,不僅麻煩,還不管用,該出錯(cuò)還是出錯(cuò)。
先前用mysql平臺(tái)連接的時(shí)候,我想起來自己處理這種問題一般就是禁用ssl驗(yàn)證或者信任根證書,那在SQL Server這里管不管用呢?答案是管用的,但是找了半天沒有找到怎么配置,后來去微軟開發(fā)者網(wǎng)站上找到了方案,就是說在URL連接里面加入 ;TrustServerCertificate=True 信任根證書。所以馬上把那段代碼改了一下:
String dbURL = "jdbc:sqlserver://localhost:1433;DatabaseName=StudentManagement;TrustServerCertificate=True";
再運(yùn)行,終于可以查出來了:文章來源:http://www.zghlxwxcb.cn/news/detail-440278.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-440278.html
浪費(fèi)了一下午的時(shí)間,終于搞定了。在此寫這篇博文,也是想給后來人提個(gè)醒,把這些坑統(tǒng)統(tǒng)避掉。
到了這里,關(guān)于記錄一下Java JDBC連接微軟SQL Server遇到的那些坑的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!