用于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)配合使用。
选择起点
- 若要设置Java开发环境并运行第一个查询,请从步骤 1 开始:配置开发环境、步骤 2:创建 SQL 数据库和步骤 3:使用Java连接到 SQL 的概念证明。
- 若要使用无密码身份验证连接到Azure SQL,请使用Microsoft Entra身份验证和生成连接 URL 开始连接。
- 若要将驱动程序添加到 Maven、Gradle 或其他构建工具中,请转到 下载适用于 SQL Server 的 Microsoft JDBC 驱动程序。
- 若要使现有应用具备应对瞬时故障的能力,请转到 连接复原能力 和 可配置的重试逻辑。
- 若要诊断连接或查询问题,请转到 诊断 JDBC 驱动程序的问题 并 排查连接问题。
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)自动进行重试,并且该机制受 connectRetryCount 和 connectRetryInterval 控制。 有关完整列表,请参阅 内置暂时性连接错误列表。 仅当您需要使用 +<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)。
有关此配置的每个部分的详细信息,请参阅:
- 生成连接 URL
- 设置连接属性
- 使用 Microsoft Entra 身份验证进行连接
- 连接复原能力
- 可配置的重试逻辑
- JDBC 驱动程序对高可用性和灾难恢复的支持
- 了解 JDBC 驱动程序中的超时属性
有关 Azure SQL 瞬态错误列表,请参阅排查瞬态连接错误。
主要功能
-
基于标准的 JDBC:类型 4 驱动程序。 JRE 11+ 构建版本实现了 JDBC 4.2,并支持 JDBC 4.3 的请求边界方法(
beginRequest、endRequest)以及Statement引用辅助方法。 JDBC 4.3 分片 API(setShardingKey、createConnectionBuilder系列)会抛出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:针对敏感列的客户端加密,并支持用于就地操作的可选安全隔离区。
-
批量复制:使用
SQLServerBulkCopyAPI 实现高吞吐量插入,并为executeBatch提供批量插入性能。 -
连接弹性:内置了针对瞬时错误的连接重试机制,并提供可选择启用的可配置重试逻辑,用于语句(
retryExec)和可自定义的连接错误列表(retryConn)。 - 丰富的SQL Server数据类型支持:datetimeoffset、sql_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 驱动程序中的超时属性 |
loginTimeout、queryTimeout、套接字超时,以及它们如何相互作用。 |
| 部署 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 |
|---|---|
| 处理语句和结果集 |
Statement、PreparedStatement 和结果集基础知识。 |
| 将 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 |
|---|---|
| 进行事务处理 |
commit、rollback和自动提交语义。 |
| 了解事务 | 事务生命周期和最佳做法。 |
| 隔离级别 | 快照、已提交读取、可序列化等。 |
| 并发控制 | 乐观和悲观并发策略。 |
| 行级锁定 | SQL Server 如何获取和释放行锁。 |
| 使用保存点 | 事务中的部分回滚。 |
| 管理事务大小 | 调整事务范围以避免长时间持有锁。 |
| XA 事务 | 使用 SQLServerXADataSource 的两阶段提交。 |
性能和可靠性
| Article | Description |
|---|---|
| 提高性能和可靠性 | 索引、查询和驱动程序级优化。 |
| 预处理语句元数据缓存 | 重复使用已准备的语句计划。 |
| 准备语句参数性能 | 参数类型化和执行计划复用。 |
| 自适应缓冲 | 流式传输大型列,而不会将它们完全加载到内存中。 |
| 不使用时关闭对象 | 及时释放 Statement、ResultSet 和 Connection 资源。 |
| 高可用性和灾难恢复 | 可用性组侦听器和多子网故障转移。 |
| 数据库镜像 | 将驱动程序与数据库镜像合作伙伴配合使用。 |
诊断和故障排除
| 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 驱动程序应用程序 | 端到端代码示例。 |
| 常见问题 | 常见问题。 |