7.4.5 SQL Server¶
Doris JDBC Catalog
支持通过标准 JDBC
接口连接 SQL Server
数据库。本文档介绍如何配置 SQL Server
数据库连接。
1 使用须知¶
要连接到 SQL Server
数据库,您需要
-
SQL Server
2012
或更高版本,或Azure SQL
数据库。 -
SQL Server
数据库的JDBC
驱动程序,您可以从Maven
仓库下载最新或指定版本的SQL Server JDBC
驱动程序。推荐使用SQL Server JDBC Driver 11.2.x
及以上版本。 -
Doris
每个FE
和BE
节点和SQL Server
服务器之间的网络连接,默认端口为1433
。
2 连接 SQL Server¶
SQL | |
---|---|
1 2 3 4 5 6 7 8 |
|
Tip
jdbc_url
定义要传递给 SQL Server JDBC
驱动程序的连接信息和参数。 SQL Server JDBC
驱动程序文档中提供了 URL
支持的参数。
2.1 连接安全¶
JDBC
驱动程序以及连接器自动使用传输层安全性( TLS
)加密和证书验证。这需要在 SQL Server
数据库主机上配置合适的 TLS
证书。
如果您没有建立必要的配置,您可以使用 encrypt
属性禁用连接字符串中的加密:
Bash | |
---|---|
1 |
|
SQL Server JDBC
驱动程序文档的 TLS
部分详细介绍了 trustServerCertificate
、 hostNameInCertificate
、 trustStore
和 trustStorePassword
等其他参数。
3 层级映射¶
映射 SQLServer
时, Doris
的一个 Database
对应于 SQL Server
中指定 Database
( jdbc_url
参数中的 <databaseName>
)下的一个 Schema
。而 Doris
的 Database
下的 Table
则对应于 SQLServer
中, Schema
下的 Tables
。即映射关系如下:
Doris | SQLServer |
---|---|
Catalog | Database |
Database | Schema |
Table | Table |
4 类型映射¶
4.1 SQL Server 到 Doris 类型映射¶
SQL Server Type | Doris Type | Comment |
---|---|---|
bit | BOOLEAN | |
tinyint | SMALLINT | SQLServer 的 tinyint 是无符号数,所以映射为 Doris 的 SMALLINT |
smallint | SMALLINT | |
int | INT | |
bigint | BIGINT | |
real | FLOAT | |
float | DOUBLE | |
money | DECIMAL(19,4) | |
smallmoney | DECIMAL(10,4) | |
decimal/numeric | DECIMAL | |
date | DATE | |
datetime/datetime2/smalldatetime | DATETIMEV2 | |
char/varchar/text/nchar/nvarchar/ntext | STRING | |
time/datetimeoffset | STRING | |
timestamp | STRING | 读取二进制数据的十六进制显示,无实际意义 |
Other | UNSUPPORTED |
5 查询优化¶
5.1 谓词下推¶
当执行类似于 where dt = '2022-01-01'
这样的查询时, Doris
能够将这些过滤条件下推到外部数据源,从而直接在数据源层面排除不符合条件的数据,减少了不必要的数据获取和传输。这大大提高了查询性能,同时也降低了对外部数据源的负载。
5.2 行数限制¶
如果在查询中带有 limit
关键字, Doris
会将 limit
转义为 SQL Server
的 TOP
语法,以减少数据传输量。
5.3 转义字符¶
Doris
会在下发到 SQL Server
的查询语句中,自动在字段名与表名上加上转义符: ([])
,以避免字段名与表名与 SQL Server
内部关键字冲突。
6 常见问题¶
-
连接
SQL Server
出现证书认证异常Bash 1 2 3
SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". ClientConnectionId:a92f3817-e8e6-4311-bc21-7c66
可在创建
Catalog
的jdbc_url
把JDBC连接串最后增加encrypt=false
,如"jdbc_url" = "jdbc:sqlserver://127.0.0.1:1433;DataBaseName=doris_test;encrypt=false"
-
连接
SQL Server
出现TLS
异常Bash 1
The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
这是因为
SQL Server
与JDBC
客户端之间的TLS
协议版本不匹配。连接的SQL Server
仅支持TLS 1.0
,而JDBC
客户端所在JAVA
环境默认禁用了TLS 1.0
。解决方式如下:
-
在
SQL Server
上启用TLS 1.2
。参考:SQL Server TLS 1.2
支持 -
启用
JDK
的TLS 1.0
。Bash 1 2 3 4 5 6 7 8 9 10 11 12 13
vim ${JAVA_HOME}/lib/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 # 删掉其中的 `TLSv1` , `TLSv1.1` , 改成下面这样即可 jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, anon, NULL, \ include jdk.disabled.namedCurves
-