我试图了解最大打开会话以及会话打开和关闭行为。我遇到了这个,我不能完全理解。
我想在我的代码中模拟“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。
请解释这种行为。
可能会发生很多事情(支持#2):1) 在更改最大连接数时,您没有正确地重新启动postgresql服务器。因此,重新启动服务器或查看此处2) Hibernate可能正在使用JDBC的会话池系统,并且您正在重复设置相同的会话变量。也许以前打开的会话是垃圾收集的,池总是可以为最新的会话腾出空间。我会尝试创建一个连接对象数组,并看看当您尝试使用打开的会话进行一些工作时会发生什么。