用于 SQL Server 的 Microsoft JDBC 驱动程序

下载 JDBC 驱动程序

用于SQL Server的 Microsoft Java 数据库连接(JDBC)驱动程序是一种类型 4 JDBC 驱动程序(纯Java,直接讨论 SQL Server TDS 协议,无需本机库),允许任何Java应用程序或应用程序服务器连接到SQL Server,Microsoft Fabric中的Azure SQL 数据库、Azure SQL 托管实例和 SQL 数据库。 它实现标准 JDBC API,并与主要Java应用程序服务器(包括 IBM WebSphere 和 SAP NetWeaver)配合使用。

选择起点

Azure SQL的生产基线

将此代码片段用作面向生产Azure SQL连接的起点。 它从应用程序配置(如Azure 应用服务应用设置、环境变量或配置文件)加载服务器名称和数据库名称,并以编程方式设置其余连接属性。 该配置结合了传输层安全性(TLS)、托管身份、发生暂时性故障时的连接重试、故障转移组的快速恢复、用于应对冷启动故障转移的更长登录超时时间,以及针对遇到 Azure SQL 限流或查询中途发生故障转移的语句的可配置重试逻辑(CRL)。

为了提高安全性和更轻松的横向扩展,请将连接信息保留在代码之外。 在生产环境中,将连接信息存储在应用程序的配置系统中,并将Azure 密钥保管库用于敏感值和集中管理的连接设置。 有关详细信息,请参阅 保护连接字符串

本文中的Java代码片段省略导入和类包装器,以简洁起见。

// Load endpoint details from application configuration. In Azure App Service,
// these can come from app settings or Key Vault-backed settings.
String serverName = System.getenv("SQL_SERVER_NAME");
String databaseName = System.getenv("SQL_DATABASE_NAME");
String port = System.getenv().getOrDefault("SQL_PORT", "1433");

if (serverName == null || databaseName == null) {
    throw new IllegalStateException(
            "Set SQL_SERVER_NAME and SQL_DATABASE_NAME in your application configuration.");
}

String url = "jdbc:sqlserver://" + serverName + ":" + port;

Properties props = new Properties();
props.setProperty("databaseName", databaseName);
props.setProperty("encrypt", "true");
props.setProperty("trustServerCertificate", "false");
props.setProperty("authentication", "ActiveDirectoryManagedIdentity");
props.setProperty("loginTimeout", "120");         // 90 is the minimum floor for this retry profile; 120 leaves practical failover margin
props.setProperty("connectRetryCount", "5");     // retry transient connection failures up to 5 times (default 1)
props.setProperty("connectRetryInterval", "15"); // 15 seconds between connection retries (default 10)
props.setProperty("multiSubnetFailover", "true"); // recommended for any Azure SQL HA listener
// props.setProperty("applicationIntent", "ReadOnly"); // uncomment to route to a readable secondary
// Retry deadlocks and lock timeouts, plus Azure SQL throttling and mid-query failover.
props.setProperty("retryExec", "1205,1222:3,5+5;40501,40613,40197,10928,10929,49918:4,5*2");

try (Connection conn = DriverManager.getConnection(url, props);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT 1")) {
    while (rs.next()) {
        System.out.println(rs.getInt(1));
    }
}

此代码片段针对Azure SQL 数据库故障转移组和Azure SQL 托管实例进行了优化。

仅当连接到故障转移组侦听器、可用性组侦听器或故障转移群集实例端点时,才设置 multiSubnetFailover=true。 对不是高可用性 (HA) 侦听器的终结点使用此属性可能会影响性能,并且不受支持。 有关详细信息,请参阅 JDBC 驱动程序对高可用性、灾难恢复的支持

该代码片段未设置 retryConn,因为驱动程序默认就会对最常见的 Azure SQL 瞬态连接错误(包括 4060、40197、40501、40613、49918、49919、49920、10928 和 10929)自动进行重试,并且该机制受 connectRetryCountconnectRetryInterval 控制。 有关完整列表,请参阅 内置暂时性连接错误列表。 仅当您需要使用 +<errorNumber> 添加 retryConn 以通过某个尚未涵盖的错误来扩展列表时,才这样做;或者将其设置为 <errorNumber>(不带前导 +)以替换它。 如果在 JDBC URL 中放置相同的值,请将其包装为 retryConn={+<errorNumber>}retryConn={<errorNumber>}

retryExec 属性由两部分组成,当你通过编程方式设置它时,写作 rule1;rule2。 如果在 JDBC URL 中放置相同的值,请将每个规则用大括号包装为 {rule1};{rule2}

  • {1205,1222:3,5+5} 在遇到死锁受害者(1205)和锁请求超时(1222)时,会按线性退避策略重试三次,等待时间分别为 5 秒、10 秒和 15 秒。 对于 1205,SQL Server在驱动程序看到错误之前回滚事务,因此重新运行单个语句是安全的。 如果死锁语句是多语句事务的一部分,则以前的语句也会回滚,CRL 不会重播它们,因此请将整个事务包装在你自己的重试循环中。 1222 会使事务保持打开状态,并且语句级重试只会在原始事务内重新执行该语句;如果你还需要限制事务持续时间,请将整个事务放在你自己的重试循环中。

  • {40501,40613,40197,10928,10929,49918:4,5*2}会对 Azure SQL 限流、查询执行过程中的故障转移以及资源限制错误进行四次重试,并采用 5 秒、10 秒、20 秒和 40 秒的指数退避间隔。 这些错误列在 connect 循环的内置瞬态错误列表中,但如果它们在针对已建立连接执行查询的过程中间发生,则会由 retryExec 捕获。 CRL 退避以 queryTimeout 为上限。 如果将 queryTimeout 设置得低于下一次计划等待时间,驱动程序会提前放弃并重新抛出异常。 选择一个queryTimeout,其大小至少应不小于 CRL 等待时间总和加上语句执行时间,否则最长的退避将不会生效。

对于 Azure SQL 数据库 故障转移组、Hyperscale 命名副本和读扩展,或者 Always On 可用性组侦听器,请在希望连接到可读的辅助副本时设置 applicationIntent=ReadOnly。 对于证书主题备用名称(SAN)不包含所连接主机的主权云,还应将 hostNameInCertificate 设置为与之匹配(例如,对于 Azure 政府,设置为 *.database.usgovcloudapi.net)。

有关此配置的每个部分的详细信息,请参阅:

有关 Azure SQL 瞬态错误列表,请参阅排查瞬态连接错误

主要功能

  • 基于标准的 JDBC:类型 4 驱动程序。 JRE 11+ 构建版本实现了 JDBC 4.2,并支持 JDBC 4.3 的请求边界方法(beginRequestendRequest)以及 Statement 引用辅助方法。 JDBC 4.3 分片 API(setShardingKeycreateConnectionBuilder 系列)会抛出 SQLFeatureNotSupportedException。 JRE 8 版本实现 JDBC 4.2。 有关每个版本细分以及支持的和不支持的 4.3 方法的完整列表,请参阅Java和 JDBC 规范支持
  • 宽平台支持:在支持Java虚拟机(JVM)的任何平台上运行,包括Windows、Linux 和 macOS。
  • 默认加密:TLS 加密的连接,作为 encrypt=true 当前驱动程序的默认值。
  • Microsoft Entra ID 身份验证:通过托管标识、服务主体、交互式、集成、默认凭据链和访问令牌流实现的无密码连接。
  • Kerberos:用于本地 Active Directory的集成身份验证。
  • NTLM:用于非域环境或遗留场景的 Windows 质询/响应身份验证。
  • Always Encrypted:针对敏感列的客户端加密,并支持用于就地操作的可选安全隔离区。
  • 批量复制:使用 SQLServerBulkCopy API 实现高吞吐量插入,并为 executeBatch 提供批量插入性能。
  • 连接弹性:内置了针对瞬时错误的连接重试机制,并提供可选择启用的可配置重试逻辑,用于语句(retryExec)和可自定义的连接错误列表(retryConn)。
  • 丰富的SQL Server数据类型支持datetimeoffsetsql_variant、JSON、空间、向量、表值参数和用户定义的类型。

开始

Article Description
系统要求 支持Java、操作系统和SQL Server版本。
支持矩阵 JDBC 驱动程序版本的详细兼容性矩阵。
下载 Microsoft SQL Server JDBC 驱动程序 下载链接、Maven 坐标和发布工件。
JDBC 驱动程序入门 安装驱动程序、配置环境并运行第一个查询。
JDBC 驱动程序概述 体系结构、支持的功能和 JDBC 规范符合性。

配置和连接

Article Description
通过 JDBC 驱动程序连接到 SQL Server 从Java打开与SQL Server实例的连接。
连接到 Azure SQL 数据库 将Java应用程序连接到Azure SQL 数据库。
生成连接 URL jdbc:sqlserver:// URL 语法和属性的完整参考资料。
设置连接属性 所有连接属性、默认值以及如何设置它们。
设置数据源属性 SQLServerDataSource 配置为可与 JNDI 和应用服务器配合使用。
处理连接 正确打开、重用和关闭连接。
使用连接池 JNDI 数据源与外部池的集成
连接复原能力 内置连接重试和断开连接检测。
可配置的重试逻辑 使用 retryExec 重试失败的语句,并使用 retryConn 自定义连接重试列表。
了解 JDBC 驱动程序中的超时属性 loginTimeoutqueryTimeout、套接字超时,以及它们如何相互作用。
部署 JDBC 驱动程序 使用应用程序打包并部署驱动程序。

Authenticate

Article Description
Microsoft Entra 身份验证 托管标识身份验证、服务主体身份验证、交互式身份验证、集成式身份验证和访问令牌身份验证。
Kerberos 集成身份验证 通过 Kerberos 和 Active Directory 进行连接。
NTLM 身份验证 使用 NTLM 凭据进行身份验证。
环回方案的客户端证书身份验证 在环回连接上使用证书对客户端进行身份验证。

Secure

Article Description
保护 JDBC 驱动程序应用程序 有关使用驱动程序Java应用程序的安全指南。
应用程序安全性 威胁模型和深层防御建议。
保护连接字符串 不要将凭据和连接字符串放入源代码中。
为加密配置客户端 信任根、证书固定和 TLS 设置。
使用加密进行连接 强制 encrypt=true 并验证服务器证书。
了解加密支持 驱动程序如何与 SQL Server 协商 TLS。
验证用户输入 参数化 SQL 并避免注入。
FIPS 模式 在符合 FIPS 的环境中运行驱动程序。
Always Encrypted 为敏感列配置客户端加密。
配合安全隔离区的 Always Encrypted 对加密列启用丰富操作。
Always Encrypted API 参考文档 列加密提供程序和密钥存储的 API 图面。

处理数据

Article Description
处理语句和结果集 StatementPreparedStatement 和结果集基础知识。
将 Statement 语句与 JDBC 驱动程序结合使用 运行参数化和非参数化语句。
处理复杂语句 存储过程、多个结果和更新计数。
处理结果集 遍历、更新和滚动浏览查询结果。
使用多个结果集 处理返回多个结果集的查询。
了解游标类型 仅向前、可滚动和可更新的游标。
使用表值参数 TABLE 参数传递给存储过程。
使用 JDBC 驱动程序进行批量复制 使用 SQLServerBulkCopy 实现高吞吐量插入。
用于批量插入的批量复制 API 加速 executeBatch 工作负荷 INSERT
执行批量操作 批量插入、更新和删除。

数据类型

Article Description
处理数据类型 将Java类型映射到SQL Server类型。
了解 JDBC 驱动程序数据类型 驱动程序类型系统和 JDBC 映射。
数据类型转换 Java和SQL Server之间的隐式和显式转换。
数据类型差异 跨边界映射类型的边缘情况。
JSON 数据类型 存储和查询 JSON 列。
空间数据类型 使用Java的几何图形地理
矢量数据类型 使用 SQL Server 的vector类型。
sql_variant 读取和写入 sql_variant 列。
用户定义的类型 使用来自Java的 CLR 用户定义类型。
区域字符集支持 Unicode 处理方式和 nvarchar 列。
国际功能 区域设置、排序规则和全球化注意事项。

事务和并发性

Article Description
进行事务处理 commitrollback和自动提交语义。
了解事务 事务生命周期和最佳做法。
隔离级别 快照、已提交读取、可序列化等。
并发控制 乐观和悲观并发策略。
行级锁定 SQL Server 如何获取和释放行锁。
使用保存点 事务中的部分回滚。
管理事务大小 调整事务范围以避免长时间持有锁。
XA 事务 使用 SQLServerXADataSource 的两阶段提交。

性能和可靠性

Article Description
提高性能和可靠性 索引、查询和驱动程序级优化。
预处理语句元数据缓存 重复使用已准备的语句计划。
准备语句参数性能 参数类型化和执行计划复用。
自适应缓冲 流式传输大型列,而不会将它们完全加载到内存中。
不使用时关闭对象 及时释放 StatementResultSetConnection 资源。
高可用性和灾难恢复 可用性组侦听器和多子网故障转移。
数据库镜像 将驱动程序与数据库镜像合作伙伴配合使用。

诊断和故障排除

Article Description
诊断 JDBC 驱动程序问题 跟踪、日志记录和常见故障模式。
连接问题疑难解答 连接错误、TLS 握手失败和命名实例。
跟踪驱动程序操作 为驱动程序启用 JDK 日志记录。
性能记录器和回调 捕获每语句性能指标。
扩展事件日志 将客户端错误与服务器端扩展事件相关联。
处理错误 SQLException、错误代码和重试提示。
Article Description
发行说明 版本历史记录和每个版本中的新增功能。
功能依赖项 Entra ID、Kerberos、Always Encrypted 等的可选依赖项。
JDBC 4.3 符合性 JDBC 4.3 API 一致性。
JDBC 4.2 符合性 JDBC 4.2 API 一致性。
JDBC 4.1 符合性 JDBC 4.1 API 一致性。
合规性和法律 规范符合性和许可。
JDBC 驱动程序 API 参考 驱动程序公开的类、接口、方法和字段。
示例 JDBC 驱动程序应用程序 端到端代码示例。
常见问题 常见问题。