You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java应用连接Azure SQL数据库需运行两次的问题求助

解决Java应用连接Azure SQL需两次运行的问题

你当前的问题是需要手动修改连接字符串两次:第一次不带database参数连接到master库创建数据库,第二次添加database参数连接目标库。可以通过代码自动完成这两个步骤,无需手动修改配置文件。

实现思路

  • 读取配置文件中的数据库名和基础连接字符串(不带database参数)
  • 先连接到Azure SQL的master库,执行数据库创建语句
  • 等待数据库创建完成后,自动使用带database参数的连接字符串连接目标库

具体代码实现

1. 配置文件调整

保持原有配置结构,确保database.properties中的连接字符串不带database参数:

tenant.properties:

devTest=DbName

database.properties:

jdbc.url=jdbc:sqlserver://XXXXXserver2.database.windows.net:1433;user=XXXX@XXXXserver2;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;

2. Java代码整合创建与连接逻辑

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class AzureSQLDbInitializer {
    public static void main(String[] args) {
        try {
            // 读取目标数据库名称
            Properties tenantProps = new Properties();
            tenantProps.load(new FileInputStream("tenant.properties"));
            String targetDbName = tenantProps.getProperty("devTest").trim();

            // 读取基础连接字符串(无database参数,默认连接master库)
            Properties dbProps = new Properties();
            dbProps.load(new FileInputStream("database.properties"));
            String baseConnectionUrl = dbProps.getProperty("jdbc.url").trim();

            // 步骤1:连接master库,创建目标数据库
            try (Connection masterConn = DriverManager.getConnection(baseConnectionUrl);
                 Statement createStmt = masterConn.createStatement()) {
                // 先检查数据库是否已存在,避免重复创建报错
                String checkExistSql = String.format("SELECT name FROM sys.databases WHERE name = N'%s'", targetDbName);
                ResultSet existRs = createStmt.executeQuery(checkExistSql);
                if (!existRs.next()) {
                    String createDbSql = String.format("CREATE DATABASE [%s]", targetDbName);
                    createStmt.executeUpdate(createDbSql);
                    System.out.println("目标数据库 " + targetDbName + " 创建成功");
                } else {
                    System.out.println("目标数据库 " + targetDbName + " 已存在");
                }
                existRs.close();
            }

            // 步骤2:等待数据库初始化完成(Azure SQL创建数据库需要时间)
            boolean isDbReady = false;
            int retryTimes = 0;
            final int MAX_RETRY = 12; // 最多等待1分钟(12*5秒)
            final long WAIT_INTERVAL = 5000; // 每次等待5秒

            while (!isDbReady && retryTimes < MAX_RETRY) {
                try (Connection checkConn = DriverManager.getConnection(baseConnectionUrl);
                     Statement checkStmt = checkConn.createStatement()) {
                    String checkSql = String.format("SELECT name FROM sys.databases WHERE name = N'%s' AND state_desc = 'ONLINE'", targetDbName);
                    ResultSet rs = checkStmt.executeQuery(checkSql);
                    isDbReady = rs.next();
                    rs.close();
                } catch (Exception e) {
                    // 数据库未就绪时可能抛出连接异常,忽略并继续等待
                }

                if (!isDbReady) {
                    Thread.sleep(WAIT_INTERVAL);
                    retryTimes++;
                    System.out.println("等待数据库就绪,重试次数:" + retryTimes);
                }
            }

            if (!isDbReady) {
                throw new RuntimeException("数据库创建后超时未就绪,请稍后重试");
            }

            // 步骤3:连接目标数据库并执行业务逻辑
            String targetConnectionUrl = baseConnectionUrl + ";database=" + targetDbName;
            try (Connection targetConn = DriverManager.getConnection(targetConnectionUrl)) {
                System.out.println("成功连接到目标数据库:" + targetDbName);
                // 在这里添加你的业务代码
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项

  • 确保使用的SQL Server账号拥有创建数据库的权限(建议使用服务器管理员账号)
  • 等待逻辑的重试次数和间隔可根据实际情况调整,Azure SQL创建数据库通常需要30秒-2分钟
  • 代码中已添加数据库存在检查,避免重复创建导致的报错

内容的提问来源于stack exchange,提问作者Shubham Saykar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:36:22