【问题标题】:too many clients already in postgrespostgres 中已经有太多客户
【发布时间】:2022-02-10 04:57:36
【问题描述】:

我正在处理一个 java 项目,它工作得很好。我能够建立联系。我在 finally 块中正确关闭了所有连接。现在我无法建立连接,甚至无法在终端中打开 psql。我怎样才能让它像以前一样工作。非常感谢

import java.sql.Connection;
import com.mchange.v2.c3p0.*;

public class MyConnection {
    public static Connection getConnection(){
        ComboPooledDataSource cpds1 = new ComboPooledDataSource(); 
        String dbDriver = "org.postgresql.Driver";
        String dbName = "jdbc:postgresql://localhost/postgres";
        cpds1.setJdbcUrl(dbName);
        String userName = "user_1";
        cpds1.setUser(userName);
        String password = "mypass";
        cpds1.setPassword(password);
        cpds1.setMaxStatements( 180 );  
        try 
        {
            cpds1.setDriverClass(dbDriver);
            return cpds1.getConnection();
        } 
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }
}

这就是我所说的

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        PrintWriter writer = response.getWriter();
        JSONObject jo = new JSONObject();
        JSONObject jObj;
        Statement stmt = null;
        Connection con = null;
        PreparedStatement ps;
        ResultSet rs = null;
        try
        {
            jObj = UtilityClass.getJSON(request);
            String uname = ((String) jObj.get("uname"));
            String pass = ((String) jObj.get("pass"));
            String sql = "SELECT * FROM users WHERE username = ?";
            try
            {
                con = MyConnection.getConnection();
                System.out.println("Got Connection");      
                stmt = con.createStatement();
                ps = con.prepareStatement(sql);
                ps.setString(1, uname);
                rs = ps.executeQuery();
                if(rs.next())
                {
                    if(BCrypt.checkpw(pass,rs.getString("password")))
                    {
                        HttpSession session = request.getSession();
                        session.setAttribute("uname", uname);
                        if(session.isNew())
                        {
                            System.out.println("new");
                        }
                        if(uname.equals("admin"))
                        {
                            session.setAttribute("role", "admin");
                            jo.put("status", "admin");
                        }
                        else
                        {
                            session.setAttribute("role", "user");
                            jo.put("status", "authenticate");
                        }
                    }
                }
                writer.print(jo);
            }
            catch (Exception e) 
            {
                e.printStackTrace();
                System.out.println("Not Connected");
            }
            finally 
            {
                if(rs != null)
                {
                    rs.close();
                }
                if(stmt != null)
                {
                    stmt.close();
                }
                if(con != null)
                {
                    con.close();
                }
            }
        }
        catch(Exception e)
        {
            System.out.print("JSON Exception");
        }
    }

【问题讨论】:

  • 每次请求连接时都会创建一个新池。
  • 在 MyConnection 中创建一个静态字段来保存一个 ComboPooledDataSource 实例,并在静态初始化程序中设置它。有关课程的更多信息,请参阅mchange.com/projects/c3p0/#using_combopooleddatasource
  • 释放连接重启你的java进程
  • 停止您的服务器进程(servlet 引擎)并重新启动它。
  • 我本以为可以修复它。你也可以重启 Postgres

标签: java postgresql


【解决方案1】:

通常,数据库管理员在数据库上使用池技术。对于 PostgreSQL,其中一个更流行的是PGBOUNCER。我们在大型项目中使用了PGBOUNCER,结果非常好。我推荐给你。要获取有关池系统的更多信息,您可以阅读此链接。 For About Pooling

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 2020-07-05
    • 2018-11-22
    • 2012-01-17
    • 1970-01-01
    • 2019-05-21
    • 2018-11-29
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多