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

本地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;
    }
}

问题排查与解决方案

先从最基础的点开始排查,逐步缩小范围:

  1. 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服务
  2. Chrome环境干扰排查

    • 试试用Chrome无痕窗口访问,排除扩展程序或缓存的影响
    • 关闭Chrome的代理设置(如果开启了),有时候代理会导致API请求无法正常到达后端
  3. 连接池与配置验证

    • 先绕过连接池,用纯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"/>
      
  4. 端口与防火墙检查

    • 用lsof -i :5432(Linux/Mac)或netstat -ano | findstr :5432(Windows)检查5432端口是否被其他进程占用
    • 确认服务器/本地防火墙开放了5432端口,没有拦截PostgreSQL的连接请求

如果以上方法都没解决,麻烦补充下:其他浏览器(比如Firefox)访问是否有同样问题?或者提供更完整的异常栈信息,这样能更精准定位问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:47:21