SpringBoot应用无法连接Oracle数据库,IntelliJ控制台可正常连接
SpringBoot应用无法连接Oracle,但IntelliJ数据库控制台可以连接
问题描述
我能够通过IntelliJ数据库控制台正常连接Oracle数据库,但SpringBoot应用尝试连接时出现TCP连接超时错误。
应用配置
spring.datasource.url=jdbc:oracle:thin:@192.168.00.00:1521:ORCL spring.datasource.username= spring.datasource.password=password
代码实现
@Autowired private JdbcTemplate jdbcTemplate; @GetMapping("/api/bears/{empId}") public int BearsCall(@PathVariable String empId) { final int[] r = {0}; // 使用数组让变量成为有效final // active , CWR , A : user_status, person_status, person_type // replace name with unique_identifier String userQuery = "SELECT extended1, extended2, extended3 " + "FROM identityiq.spt_identity " + "WHERE name = ?"; String hasRole = "SELECT COUNT(*) AS role_count " + "FROM identityiq.spt_identity_assigned_roles i " + "JOIN identityiq.spt_bundle b ON i.bundle = b.id " + "JOIN identityiq.spt_identity u ON i.identity_id = u.id " + "WHERE u.name = ? " + "AND b.name = 'Role - Baseline Standard Access User'"; try { // 查询用户 Object[] params = {empId}; jdbcTemplate.query(userQuery, params, (ResultSet rs) -> { if (rs.next()) { String adStatus = rs.getString("extended2") != null ? rs.getString("extended2") : "Unknown"; if (!adStatus.equalsIgnoreCase("unknown")) { // 查询角色数量 int roleCount = jdbcTemplate.queryForObject(hasRole, Integer.class, empId); if (roleCount > 0) { r[0] = 2; } } else { r[0] = 1; } } else { r[0] = 0; } }); } catch (Exception e) { // 处理异常 e.printStackTrace(); } return r[0]; }
错误信息
java.sql.SQLTimeoutException: ORA-12170: 无法连接。主机192.168.00.00端口1521的TCP连接超时时间为30000ms。(CONNECTION_ID=h6LYhOpKQ6SXelYm+4==) at oracle.jdbc.driver.T4CConnection.handleLogonNetException(T4CConnection.java:1382) ~[ojdbc8-23.3.0.23.09.jar:23.3.0.23.09] at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:975) ~[ojdbc8-23.3.0.23.09.jar:23.3.0.23.09] at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:1126) ~[ojdbc8-23.3.0.23.09.jar:23.3.0.23.09] at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:104) ~[ojdbc8-23.3.0.23.09.jar:23.3.0.23.09] at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:825) ~[ojdbc8-23.3.0.23.09.jar:23.3.0.23.09] at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:651) ~[ojdbc8-23.3.0.23.09.jar:23.3.0.23.09] at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar:na] at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) ~[spring-jdbc-5.3.15.jar:5.3.15] at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) ~[spring-jdbc-5.3.15.jar:5.3.15] at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) ~[spring-jdbc-5.3.15.jar:5.3.15] at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:646) ~[spring-jdbc-5.3.15.jar:5.3.15] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713) ~[spring-jdbc-5.3.15.jar:5.3.15] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:744) ~[spring-jdbc-5.3.15.jar:5.3.15] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:773) ~[spring-jdbc-5.3.15.jar:5.3.15] at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:784) ~[spring-jdbc-5.3.15.jar:5.3.15] at com.zephon.WebApp.controller.myController.BearsCall(myController.java:301) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.15.jar:5.3.15] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.15.jar:5.3.15] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.15.jar:5.3.15] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.15.jar:5.3.15] at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.56.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.15.jar:5.3.15] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.56.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.15.jar:5.3.15] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar:5.3.15] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.15.jar:5.3.15] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar:5.3.15] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.15.jar:5.3.15] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar:5.3.15] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] Caused by: oracle.net.ns.NetException: ORA-12170: 无法连接。主机192.168.00.00端口1521的TCP连接超时时间为30000ms。(CONNECTION_ID=h6LYhOpKQ6SXelYm==)
排查解决步骤
- 补全数据源用户名:配置中
spring.datasource.username为空,IntelliJ连接时肯定填写了正确用户名,补上该项。 - 修正JDBC URL格式:Oracle 12c及以后推荐使用服务名格式:
jdbc:oracle:thin:@//192.168.00.00:1521/ORCL,原格式用冒号对应SID,确认Oracle实例的标识类型,和IntelliJ的配置保持一致。 - 验证应用运行环境的网络连通性:在SpringBoot应用运行的机器上执行
telnet 192.168.00.00 1521或nc -zv 192.168.00.00 1521,确认端口是否可达。 - 延长连接超时时间:添加Hikari连接池配置
spring.datasource.hikari.connection-timeout=60000,将超时时间延长到60秒,避免网络延迟导致超时。 - 匹配JDBC驱动版本:确认项目依赖的ojdbc8版本和IntelliJ使用的驱动版本一致,同时Oracle服务器版本与驱动版本
相关产品推荐
相关产品推荐

