本地Tomcat服务器上Java REST-API无法连接PostgreSQL数据库求助
REST API无法连接PostgreSQL(Chrome访问场景)
我正在开发一款REST API,最近碰到个头疼的问题:当通过Chrome浏览器访问关联网页时,这个API居然连不上PostgreSQL数据库。下面我会给出精简后的异常栈信息、涉及的Java类与XML文件的说明,以及相关代码片段,希望各位能帮忙排查问题,给出解答或反馈!
精简异常栈信息
org.postgresql.util.PSQLException: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:319) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223) at org.postgresql.Driver.makeConnection(Driver.java:465) at org.postgresql.Driver.connect(Driver.java:264) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) at com.myapp.db.DBConnectionManager.getConnection(DBConnectionManager.java:42)
涉及的类与XML文件说明
DBConnectionManager.java:自定义的数据库连接管理类,负责从连接池获取数据库连接,位于com.myapp.db包下applicationContext.xml:Spring配置文件,用于配置数据源和连接池,位于项目src/main/resources目录下RestApiController.java:处理REST请求的控制器类,调用DBConnectionManager获取连接执行数据库操作,位于com.myapp.controller包下
相关代码片段
DBConnectionManager.java
package com.myapp.db; import com.zaxxer.hikari.HikariDataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.sql.Connection; import java.sql.SQLException; @Component public class DBConnectionManager { @Autowired private HikariDataSource dataSource; public Connection getConnection() throws SQLException { return dataSource.getConnection(); } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.myapp"/> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> <property name="driverClassName" value="org.postgresql.Driver"/> <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/mydb"/> <property name="username" value="postgres"/> <property name="password" value="mypassword"/> <property name="maximumPoolSize" value="10"/> </bean> </beans>
RestApiController.java
package com.myapp.controller; import com.myapp.db.DBConnectionManager; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @RestController public class RestApiController { @Autowired private DBConnectionManager dbConnectionManager; @GetMapping("/api/data") public List<String> getData() { List<String> dataList = new ArrayList<>(); try (Connection conn = dbConnectionManager.getConnection(); PreparedStatement stmt = conn.prepareStatement("SELECT name FROM users"); ResultSet rs = stmt.executeQuery()) { while (rs.next()) { dataList.add(rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("Failed to fetch data", e); } return dataList; } }
问题排查与解决方案
先从最基础的点开始排查,逐步缩小范围:
PostgreSQL服务与连接权限检查
- 先确认PostgreSQL服务是否在运行:终端执行
pg_ctl status(Windows可在服务列表中查看) - 检查TCP/IP连接配置:打开
postgresql.conf,确保listen_addresses = '*'(或包含你的服务器IP/localhost);再修改pg_hba.conf,添加host all all 0.0.0.0/0 scram-sha-256(生产环境要限制IP范围),修改后重启PostgreSQL服务
- 先确认PostgreSQL服务是否在运行:终端执行
Chrome环境干扰排查
- 试试用Chrome无痕窗口访问,排除扩展程序或缓存的影响
- 关闭Chrome的代理设置(如果开启了),有时候代理会导致API请求无法正常到达后端
连接池与配置验证
- 先绕过连接池,用纯JDBC代码测试连接:
public static void main(String[] args) { String url = "jdbc:postgresql://localhost:5432/mydb"; String user = "postgres"; String password = "mypassword"; try (Connection conn = DriverManager.getConnection(url, user, password)) { System.out.println("Connected successfully!"); } catch (SQLException e) { e.printStackTrace(); } } - 如果纯JDBC能连上,那可能是Hikari连接池配置问题,可添加超时属性优化:
<property name="connectionTimeout" value="30000"/> <property name="idleTimeout" value="600000"/>
- 先绕过连接池,用纯JDBC代码测试连接:
端口与防火墙检查
- 用
lsof -i :5432(Linux/Mac)或netstat -ano | findstr :5432(Windows)检查5432端口是否被其他进程占用 - 确认服务器/本地防火墙开放了5432端口,没有拦截PostgreSQL的连接请求
- 用
如果以上方法都没解决,麻烦补充下:其他浏览器(比如Firefox)访问是否有同样问题?或者提供更完整的异常栈信息,这样能更精准定位问题!
内容的提问来源于stack exchange,提问作者deliciouscookiedev
相关产品推荐
相关产品推荐

