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
相关产品推荐
相关产品推荐

