Java如何连接多个数据库

在开发过程中,我们经常需要连接多个数据库来进行数据的读取、写入和同步等操作。本文将介绍如何使用Java来连接多个数据库,并提供一个实际问题的解决方案。

问题描述

假设我们有两个数据库,一个是MySQL数据库,另一个是Oracle数据库。我们需要从MySQL数据库中读取数据,并将数据写入到Oracle数据库中。同时,我们还要实现数据的同步功能,即当MySQL数据库中的数据发生变化时,自动同步到Oracle数据库中。

解决方案

为了解决上述问题,我们可以使用Java中的数据库连接池来连接多个数据库,并使用触发器或轮询的方式来实现数据的同步。接下来,我们将分几个步骤来实现这个解决方案。

第一步:引入依赖

首先,我们需要引入数据库连接池和数据库驱动的依赖。在本例中,我们使用的是HikariCP作为数据库连接池,以及MySQL和Oracle的数据库驱动。

<!-- 数据库连接池 -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.4.5</version>
</dependency>

<!-- MySQL数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>

<!-- Oracle数据库驱动 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>19.8.0.0</version>
</dependency>

第二步:配置连接池

接下来,我们需要配置连接池,以便连接到MySQL和Oracle数据库。

MySQL数据库连接池配置
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class MySQLDataSource {
    private static final String URL = "jdbc:mysql://localhost:3306/mydb";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "password";

    private static HikariConfig config;
    private static HikariDataSource dataSource;

    static {
        config = new HikariConfig();
        config.setJdbcUrl(URL);
        config.setUsername(USERNAME);
        config.setPassword(PASSWORD);
        dataSource = new HikariDataSource(config);
    }

    public static HikariDataSource getDataSource() {
        return dataSource;
    }
}
Oracle数据库连接池配置
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class OracleDataSource {
    private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
    private static final String USERNAME = "username";
    private static final String PASSWORD = "password";

    private static HikariConfig config;
    private static HikariDataSource dataSource;

    static {
        config = new HikariConfig();
        config.setJdbcUrl(URL);
        config.setUsername(USERNAME);
        config.setPassword(PASSWORD);
        dataSource = new HikariDataSource(config);
    }

    public static HikariDataSource getDataSource() {
        return dataSource;
    }
}

第三步:读取MySQL数据并写入Oracle数据库

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.zaxxer.hikari.HikariDataSource;

public class DataSync {
    public static void main(String[] args) {
        HikariDataSource mysqlDataSource = MySQLDataSource.getDataSource();
        HikariDataSource oracleDataSource = OracleDataSource.getDataSource();
        
        Connection mysqlConnection = null;
        Connection oracleConnection = null;
        PreparedStatement selectStatement = null;
        PreparedStatement insertStatement = null;
        
        try {
            mysqlConnection = mysqlDataSource.getConnection();
            oracleConnection = oracleDataSource.getConnection();
            
            // 从MySQL数据库中读取数据
            String selectQuery = "SELECT * FROM my_table";
            selectStatement = mysqlConnection.prepareStatement(selectQuery);
            ResultSet resultSet = selectStatement.executeQuery();
            
            while (resultSet.next()) {
                // 将数据写入Oracle数据库
                String insertQuery = "INSERT INTO my_table VALUES (?, ?)";
                insertStatement = oracleConnection.prepareStatement(insertQuery);
                insertStatement.setInt(1, resultSet.getInt("id"));
                insertStatement.setString(2, resultSet.getString("name"));
                insertStatement.executeUpdate();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭连接和释放资源
            try {
                if (selectStatement != null) {
                    select