在日常开发中,我们经常需要连接不同类型的数据库,如MySQL、Oracle、PostgreSQL、StarRocks和MongoDB。每种数据库都有其独特的错误码和错误信息,当连接失败时,能够提供明确的错误提示对快速定位问题至关重要。
本文将通过一个Java示例代码,展示如何处理连接多种数据库,并在连接失败时给出明确的提示。
常见数据库连接失败的错误码及其含义
首先,我们列出了几种常见数据库连接失败时的错误码及其含义:
数据库 | 错误码/状态码 | 含义 |
---|---|---|
MySQL | 1045 | 账号或密码错误 |
MySQL | 1044 | 权限不足 |
MySQL | 2003 | 无法连接到MySQL服务器 |
MySQL | 2005 | 无法解析MySQL主机名 |
Oracle | 01017 | 账号或密码错误 |
Oracle | 12170 | 无法连接到Oracle数据库 |
Oracle | 12514 | 监听程序无法解析服务名 |
Oracle | 28000 | 账号被锁定 |
PostgreSQL | 28000 | 账号或密码错误 |
PostgreSQL | 42501 | 权限不足 |
PostgreSQL | 08001 | 无法连接到PostgreSQL服务器 |
PostgreSQL | 08006 | 连接失败(网络问题) |
StarRocks | - | 请参考StarRocks官方文档获取具体错误码 |
MongoDB | 18 | 认证失败(账号或密码错误) |
MongoDB | 13 | 权限不足 |
MongoDB | 6 | 无法连接到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());
}
}
}
代码说明
- DatabaseType 枚举:定义支持的数据库类型。
- connectToDatabase 方法:根据数据库类型连接到相应的数据库。
- connectToMongoDB 方法:连接到MongoDB数据库,并进行简单的连接测试。
- handleSQLException 方法:根据数据库类型和错误信息给出相应的提示信息。
- handleMongoException 方法:处理MongoDB的连接错误,并给出相应的提示信息。
结语
通过上述示例代码,我们展示了如何处理连接多种数据库,并在连接失败时给出明确的提示信息。您可以根据实际需求调整错误处理逻辑,并扩
展支持的数据库类型。希望这篇文章能帮助您在开发中更高效地处理数据库连接问题。