如何处理多种数据库连接失败并提供明确的错误提示

在日常开发中,我们经常需要连接不同类型的数据库,如MySQL、Oracle、PostgreSQL、StarRocks和MongoDB。每种数据库都有其独特的错误码和错误信息,当连接失败时,能够提供明确的错误提示对快速定位问题至关重要。

本文将通过一个Java示例代码,展示如何处理连接多种数据库,并在连接失败时给出明确的提示。

常见数据库连接失败的错误码及其含义

首先,我们列出了几种常见数据库连接失败时的错误码及其含义:

数据库错误码/状态码含义
MySQL1045账号或密码错误
MySQL1044权限不足
MySQL2003无法连接到MySQL服务器
MySQL2005无法解析MySQL主机名
Oracle01017账号或密码错误
Oracle12170无法连接到Oracle数据库
Oracle12514监听程序无法解析服务名
Oracle28000账号被锁定
PostgreSQL28000账号或密码错误
PostgreSQL42501权限不足
PostgreSQL08001无法连接到PostgreSQL服务器
PostgreSQL08006连接失败(网络问题)
StarRocks-请参考StarRocks官方文档获取具体错误码
MongoDB18认证失败(账号或密码错误)
MongoDB13权限不足
MongoDB6无法连接到MongoDB服务器
MongoDB-连接超时

Java示例代码

下面的Java代码展示了如何连接多种数据库,并在连接失败时给出明确的提示。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoException;

public class DatabaseConnectionManager {
    public enum DatabaseType {
        MYSQL, ORACLE, POSTGRESQL, STARROCKS, MONGODB
    }

    public static void main(String[] args) {
        // 各种数据库配置
        String mysqlUrl = "jdbc:mysql://localhost:3306/yourdatabase";
        String mysqlUser = "yourusername";
        String mysqlPassword = "yourpassword";

        String oracleUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
        String oracleUser = "yourusername";
        String oraclePassword = "yourpassword";

        String postgresUrl = "jdbc:postgresql://localhost:5432/yourdatabase";
        String postgresUser = "yourusername";
        String postgresPassword = "yourpassword";

        String starrocksUrl = "jdbc:mysql://localhost:9030/yourdatabase";
        String starrocksUser = "yourusername";
        String starrocksPassword = "yourpassword";

        String mongoUri = "mongodb://yourusername:yourpassword@localhost:27017/yourdatabase";

        // 尝试连接各个数据库
        try {
            Connection connection = connectToDatabase(DatabaseType.MYSQL, mysqlUrl, mysqlUser, mysqlPassword);
            System.out.println("MySQL连接成功!");
        } catch (SQLException e) {
            handleSQLException(DatabaseType.MYSQL, e);
        }

        try {
            Connection connection = connectToDatabase(DatabaseType.ORACLE, oracleUrl, oracleUser, oraclePassword);
            System.out.println("Oracle连接成功!");
        } catch (SQLException e) {
            handleSQLException(DatabaseType.ORACLE, e);
        }

        try {
            Connection connection = connectToDatabase(DatabaseType.POSTGRESQL, postgresUrl, postgresUser, postgresPassword);
            System.out.println("PostgreSQL连接成功!");
        } catch (SQLException e) {
            handleSQLException(DatabaseType.POSTGRESQL, e);
        }

        try {
            Connection connection = connectToDatabase(DatabaseType.STARROCKS, starrocksUrl, starrocksUser, starrocksPassword);
            System.out.println("StarRocks连接成功!");
        } catch (SQLException e) {
            handleSQLException(DatabaseType.STARROCKS, e);
        }

        try {
            connectToMongoDB(mongoUri);
            System.out.println("MongoDB连接成功!");
        } catch (MongoException e) {
            handleMongoException(e);
        }
    }

    public static Connection connectToDatabase(DatabaseType dbType, String url, String user, String password) throws SQLException {
        switch (dbType) {
            case MYSQL:
            case STARROCKS:
                return DriverManager.getConnection(url, user, password);
            case ORACLE:
                return DriverManager.getConnection(url, user, password);
            case POSTGRESQL:
                return DriverManager.getConnection(url, user, password);
            default:
                throw new SQLException("不支持的数据库类型");
        }
    }

    public static void connectToMongoDB(String uri) throws MongoException {
        MongoClientURI clientUri = new MongoClientURI(uri);
        MongoClient mongoClient = new MongoClient(clientUri);
        mongoClient.getDatabase("yourdatabase").listCollectionNames().first();  // 测试连接
        mongoClient.close();
    }

    private static void handleSQLException(DatabaseType dbType, SQLException e) {
        if (dbType == DatabaseType.MYSQL || dbType == DatabaseType.STARROCKS) {
            switch (e.getErrorCode()) {
                case 1045:
                    System.out.println("MySQL/StarRocks账号或密码错误,请检查后再试。");
                    break;
                case 1044:
                    System.out.println("MySQL/StarRocks权限不足,无法访问指定的数据库。");
                    break;
                case 2003:
                    System.out.println("MySQL/StarRocks无法连接到服务器,请检查网络连接。");
                    break;
                case 2005:
                    System.out.println("MySQL/StarRocks无法解析主机名,请检查主机名配置。");
                    break;
                default:
                    System.out.println("MySQL/StarRocks连接数据库失败,错误代码:" + e.getErrorCode());
                    System.out.println("错误信息:" + e.getMessage());
            }
        } else if (dbType == DatabaseType.ORACLE) {
            switch (e.getErrorCode()) {
                case 1017:
                    System.out.println("Oracle账号或密码错误,请检查后再试。");
                    break;
                case 12170:
                    System.out.println("Oracle无法连接到数据库,请检查网络连接。");
                    break;
                case 12514:
                    System.out.println("Oracle监听程序无法解析服务名,请检查服务名配置。");
                    break;
                case 28000:
                    System.out.println("Oracle账号被锁定,请联系管理员。");
                    break;
                default:
                    System.out.println("Oracle连接数据库失败,错误代码:" + e.getErrorCode());
                    System.out.println("错误信息:" + e.getMessage());
            }
        } else if (dbType == DatabaseType.POSTGRESQL) {
            switch (e.getSQLState()) {
                case "28000":
                    System.out.println("PostgreSQL账号或密码错误,请检查后再试。");
                    break;
                case "42501":
                    System.out.println("PostgreSQL权限不足,无法访问指定的数据库。");
                    break;
                case "08001":
                    System.out.println("PostgreSQL无法连接到服务器,请检查网络连接。");
                    break;
                case "08006":
                    System.out.println("PostgreSQL连接失败,请检查网络配置。");
                    break;
                default:
                    System.out.println("PostgreSQL连接数据库失败,SQL状态:" + e.getSQLState());
                    System.out.println("错误信息:" + e.getMessage());
            }
        }
    }

    private static void handleMongoException(MongoException e) {
        switch (e.getCode()) {
            case 18:
                System.out.println("MongoDB认证失败,账号或密码错误。");
                break;
            case 13:
                System.out.println("MongoDB权限不足,无法访问指定的数据库。");
                break;
            case 6:
                System.out.println("MongoDB无法连接到服务器,请检查网络连接。");
                break;
            default:
                System.out.println("MongoDB连接数据库失败,错误代码:" + e.getCode());
                System.out.println("错误信息:" + e.getMessage());
        }
    }
}

代码说明

  1. DatabaseType 枚举:定义支持的数据库类型。
  2. connectToDatabase 方法:根据数据库类型连接到相应的数据库。
  3. connectToMongoDB 方法:连接到MongoDB数据库,并进行简单的连接测试。
  4. handleSQLException 方法:根据数据库类型和错误信息给出相应的提示信息。
  5. handleMongoException 方法:处理MongoDB的连接错误,并给出相应的提示信息。

结语

通过上述示例代码,我们展示了如何处理连接多种数据库,并在连接失败时给出明确的提示信息。您可以根据实际需求调整错误处理逻辑,并扩

展支持的数据库类型。希望这篇文章能帮助您在开发中更高效地处理数据库连接问题。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一个懒人吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值