模拟“PSQLException:致命:抱歉,已经有太多客户”

时间:2014-11-03 10:25:52

标签: java postgresql postgresql-8.4

我试图理解最大开放会话,以及sessiion开放和关闭行为。我遇到了这个,完全无法理解。

我想在我的代码中模拟“PSQLException: FATAL: sorry, too many clients already”。 我已将max_connections设置为10。

并尝试了这段代码:

Session session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();
        session = HibernateUtil.getSessionFactory().openSession();

我期待第11次电话会出现错误,我不明白。当我运行我相信的sql命令SELECT datname, numbackends FROM pg_stat_database where datname = 'XXX';将显示打开的会话计数时,我看到它的上限为10.

请解释一下这种行为。

1 个答案:

答案 0 :(得分:1)

可能会发生许多事情(赞成#2): 1)更改最大连接数时未正确重新启动postgresql服务器。因此,重新启动服务器或查看here 2)Hibernate可能正在使用JDBC的池化系统进行会话,并且您正在重复设置相同的会话变量。也许以前的开放会话是垃圾收集,并且池总是可以为最新的会话腾出空间。我会尝试创建一个连接对象数组,并且还会看到当您尝试使用打开的会话时会发生什么。