You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码连接MySQL数据库出现通信链路故障问题求助

问题核心:用错了JDBC驱动和连接字符串!

嘿,兄弟,我一眼就瞅出问题所在了——你明明要连的是Oracle数据库,但代码里全是MySQL的配置,这能连上才怪呢!

咱们先理清楚矛盾点:

  • 你说用Oracle SQL Developer能连,数据库是XEPDB1(Oracle的可插拔数据库),端口1521(Oracle默认端口),这些都是Oracle的特征
  • 但你的代码里用的是jdbc:mysql://的连接前缀,加载的是com.mysql.cj.jdbc.Driver驱动,完全是MySQL那套配置,和Oracle不兼容

修正步骤来啦:

1. 替换JDBC驱动

你需要用Oracle官方的JDBC驱动,而不是MySQL的:

  • 如果用Maven管理依赖,添加Oracle的ojdbc11(对应你的JDK17版本):
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc11</artifactId>
        <version>21.13.0.0</version>
    </dependency>
    
  • 手动引入的话,下载ojdbc11.jar添加到项目的依赖库中

2. 修正连接字符串和驱动类

Oracle的JDBC连接格式和MySQL完全不同,针对你的XEPDB1可插拔数据库,正确的配置是:

  • 驱动类:oracle.jdbc.OracleDriver(新版本推荐用这个,旧版的oracle.jdbc.driver.OracleDriver也能凑合用)
  • 连接字符串:jdbc:oracle:thin:@//192.168.56.103:1521/XEPDB1

3. 修改你的代码

把原来的MySQL相关配置全部替换掉,修改后的代码片段如下:

public class DatabaseManager { 
    private static DatabaseManager instance = new DatabaseManager(); 
    private static final String DOMAIN_STRING = "192.168.56.103:1521"; 
    private static final String DB_NAME = "XEPDB1"; 
    private static final String USER_NAME = "hr"; 
    private static final String PASSWORD = "hr"; 
    // 修正Oracle连接字符串
    private static final String CONNECTION_STRING = "jdbc:oracle:thin:@//" + DOMAIN_STRING + "/" + DB_NAME; 
    private Connection connection; 

    private DatabaseManager(){ 
        super(); 
        try { 
            init(); 
        } catch (Exception e) { 
            System.out.println("Failed to init DatabaseManager: "+e); 
        } 
    } 

    public static DatabaseManager getInstance() { 
        return instance; 
    } 

    private void init() throws ClassNotFoundException, SQLException { 
        // 加载Oracle驱动
        Class.forName("oracle.jdbc.OracleDriver"); 
        System.out.println("JDBC driver loaded successfully!"); 
        System.out.println("CONNECTION_STRING: "+CONNECTION_STRING); 
        // 把用户名密码单独传入,比拼在URL里更清晰安全
        connection = DriverManager.getConnection(CONNECTION_STRING, USER_NAME, PASSWORD); 
        System.out.println("Connected to database "+DB_NAME); 
    }
}

额外小提醒:

  • 因为你用Oracle SQL Developer能正常连接,说明数据库监听是正常的,这点不用纠结
  • JDBC4.0之后其实可以不用手动调用Class.forName()加载驱动,驱动会自动注册到DriverManager里,不过保留这段代码也没什么问题
  • 确保你的ojdbc版本和JDK版本匹配(JDK17对应ojdbc11),版本不兼容也可能出奇怪的问题

内容的提问来源于stack exchange,提问作者Alexey Kozlov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:02:45