无法连接Oracle自治数据库:Java代码连接故障排查及解决
问题:NetBeans中Java连接Oracle自治数据库(19c)报错Connection reset
问题详情
尝试在NetBeans中通过Java代码连接Oracle自治数据库,已配置数据库参数、将自身IP加入访问控制列表,且无需双向TLS认证(使用钱包可通过VS Code SQL扩展成功连接,但不想依赖钱包),但建立连接时仍报错。
原连接代码
try{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@my_hostname:my_port/service_name","admin","my_admin_password"); }catch (SQLException e) { System.out.println(e.getMessage()); e.printStackTrace(); } catch (ClassNotFoundException e) { System.out.println(e.getMessage()); e.printStackTrace(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); }
环境与数据库信息
- 数据库版本:19c
- 实例类型:免费版
- 访问类型:允许指定IP和VCN的安全访问
- 访问控制列表:已启用
- 双向TLS(mTLS)认证:无需
- 项目依赖:已添加ojdbc10.jar,使用SDK17
报错信息
Error de SQL: Error de E/S: Connection reset, Authentication lapse 0 ms. java.sql.SQLRecoverableException: Error de E/S: Connection reset, Authentication lapse 0 ms. at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:927) at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:820) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:80) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:820) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:624) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229) at example_ant.exampleClass.main(exampleClass.java:37) Caused by: java.io.IOException: Connection reset, Authentication lapse 0 ms. at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:923) ... 7 more Caused by: java.net.SocketException: Connection reset at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:394) at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:426) at oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:187) at oracle.net.ns.NSProtocolNIO.doSocketRead(NSProtocolNIO.java:676) at oracle.net.ns.NIOPacket.readNIOPacket(NIOPacket.java:408) at oracle.net.ns.NSProtocolNIO.negotiateConnection(NSProtocolNIO.java:143) at oracle.net.ns.NSProtocol.connect(NSProtocol.java:353) at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1706) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:631) ... 7 more
解决方案(更新)
问题根源在于JDBC URL的构造方式错误——之前使用的是host:port/service_name的简化格式,而非完整的TNS描述字符串。
修正后的连接代码:
Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=my_port)(host=my_host))(connect_data=(service_name=my_service_name))(security=(ssl_server_dn_match=yes)))","user","password");
内容的提问来源于stack exchange,提问作者Earth Affairs
相关产品推荐
相关产品推荐

