java怎么切换数据库
- 后端开发
- 2025-07-21
- 6
Java开发中,切换数据库是一个常见的需求,尤其是在多数据源环境或需要动态调整数据库连接的场景下,以下是几种常用的Java切换数据库的方法及其详细实现:
使用配置文件进行数据库切换
原理:通过读取不同的配置文件来获取不同数据库的连接信息,从而实现切换。
实现步骤:
-
创建多个配置文件,每个文件对应一个数据库的连接信息。db1.properties和db2.properties如下:
- db1.properties: jdbc.url=jdbc:mysql://localhost:3306/db1 jdbc.username=user1 jdbc.password=password1
- db2.properties: jdbc.url=jdbc:mysql://localhost:3306/db2 jdbc.username=user2 jdbc.password=password2
-
在代码中根据业务需求读取相应的配置文件,并建立数据库连接。
import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; public class DatabaseSwitcher { public static Connection getConnection(String configFile) throws IOException, ClassNotFoundException, SQLException { Properties properties = new Properties(); properties.load(new FileInputStream(configFile)); String url = properties.getProperty("jdbc.url"); String username = properties.getProperty("jdbc.username"); String password = properties.getProperty("jdbc.password"); Class.forName("com.mysql.cj.jdbc.Driver"); return DriverManager.getConnection(url, username, password); } public static void main(String[] args) { try { // 切换到db1 Connection conn1 = getConnection("db1.properties"); // 执行db1的操作 conn1.close(); // 切换到db2 Connection conn2 = getConnection("db2.properties"); // 执行db2的操作 conn2.close(); } catch (Exception e) { e.printStackTrace(); } } }
优点:简单直观,易于理解和实现。

缺点:每次切换都需要重新读取配置文件并建立连接,效率较低;不适合频繁切换的场景。
使用数据库连接池进行数据库切换
原理:通过配置多个数据库连接池,在运行时动态选择连接池来实现数据库切换。
实现步骤:
-
引入数据库连接池依赖,如HikariCP,在pom.xml中添加:
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> -
配置多个数据源和连接池:
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; public class DataSourceConfig { private static HikariDataSource ds1; private static HikariDataSource ds2; static { HikariConfig config1 = new HikariConfig(); config1.setJdbcUrl("jdbc:mysql://localhost:3306/db1"); config1.setUsername("user1"); config1.setPassword("password1"); ds1 = new HikariDataSource(config1); HikariConfig config2 = new HikariConfig(); config2.setJdbcUrl("jdbc:mysql://localhost:3306/db2"); config2.setUsername("user2"); config2.setPassword("password2"); ds2 = new HikariDataSource(config2); } public static HikariDataSource getDataSource(String dbName) { if ("db1".equals(dbName)) { return ds1; } else if ("db2".equals(dbName)) { return ds2; } return null; } }
-
在业务代码中根据需要获取对应的数据源:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DatabaseService { public void performOperation(String dbName) { HikariDataSource ds = DataSourceConfig.getDataSource(dbName); if (ds == null) { System.out.println("Invalid database name"); return; } try (Connection conn = ds.getConnection(); PreparedStatement stmt = conn.prepareStatement("SELECT FROM table_name")) { ResultSet rs = stmt.executeQuery(); while (rs.next()) { // 处理结果集 } } catch (SQLException e) { e.printStackTrace(); } } }
优点:提高了数据库连接的效率和性能,适合高并发场景。
缺点:需要额外配置和管理连接池,增加了系统的复杂性。
使用Spring框架的AbstractRoutingDataSource类进行数据库切换
原理:通过继承Spring的AbstractRoutingDataSource类,根据业务需求动态选择数据源。
实现步骤:

-
定义数据源配置类,配置多个数据源:
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; import com.zaxxer.hikari.HikariDataSource; @Configuration public class DataSourceConfig { @Bean(name = "ds1") @ConfigurationProperties(prefix = "spring.datasource.ds1") public HikariDataSource ds1() { return new HikariDataSource(); } @Bean(name = "ds2") @ConfigurationProperties(prefix = "spring.datasource.ds2") public HikariDataSource ds2() { return new HikariDataSource(); } @Bean public AbstractRoutingDataSource dataSource(@Qualifier("ds1") HikariDataSource ds1, @Qualifier("ds2") HikariDataSource ds2) { DynamicDataSource dynamicDataSource = new DynamicDataSource(); Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("ds1", ds1); targetDataSources.put("ds2", ds2); dynamicDataSource.setTargetDataSources(targetDataSources); dynamicDataSource.setDefaultTargetDataSource(ds1); return dynamicDataSource; } }
-
创建DynamicDataSource类继承AbstractRoutingDataSource,并重写determineCurrentLookupKey方法:
-
在业务代码中通过DynamicDataSource.setDataSourceType方法设置当前数据源:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private JdbcTemplate jdbcTemplate; public void performOperation(String dbName) { DynamicDataSource.setDataSourceType(dbName); // 执行数据库操作,这里会自动使用设置的数据源 String sql = "SELECT FROM user"; List<Map<String, Object>> results = jdbcTemplate.queryForList(sql); // 处理结果集 } } -
在application.properties中配置数据源信息:
spring.datasource.ds1.jdbc-url=jdbc:mysql://localhost:3306/db1 spring.datasource.ds1.username=user1 spring.datasource.ds1.password=password1 spring.datasource.ds2.jdbc-url=jdbc:mysql://localhost:3306/db2 spring.datasource.ds2.username=user2 spring.datasource.ds2.password=password2
优点:实现了动态数据源切换,灵活性高,适合复杂的业务场景。
缺点:需要熟悉Spring框架的配置和使用,学习成本较高。
方法对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 配置文件切换 | 简单直观,易于理解和实现 | 每次切换需重新读取配置文件并建立连接,效率低;不适合频繁切换 | 切换不频繁,对性能要求不高的场景 |
| 数据库连接池切换 | 提高连接效率和性能,适合高并发 | 需额外配置和管理连接池,增加系统复杂性 | 高并发、对性能要求较高的场景 |
| Spring框架切换 | 动态切换,灵活性高 | 需熟悉Spring框架,学习成本较高 | 复杂业务场景,需要 |