我正在使用一个spring应用程序,我得到以下异常:
Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection.
当我手动尝试使用DBVisualizer连接到数据库时,我收到以下错误
An error occurred while establishing the connection:
Long Message:
FATAL: connection limit exceeded for non-superusers
Details:
Type: org.postgresql.util.PSQLException
Error Code: 0
SQL State: 53300
这是我的spring-context.xml文件
<jee:jndi-lookup id="dataSource1" jndi-name="jdbc/PmdDS"/>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource1" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="current_session_context_class">thread</prop>
<prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
</props>
</property>
</bean>
我的问题是我收到此错误,因为我没有在spring-context.xml中添加以下行
<prop key="hibernate.connection.release_mode">auto</prop>
添加此行将解决我的问题。我担心我的应用程序正在创建连接但没有释放数据库连接,因为我没有在spring-context.xml中添加上面的行。
注意我没有使用HibernateTemplate。我正在使用sessionFactory.getCurrentSession().createQuery("").list()
来解决我的疑问
我的Context.xml详细信息
<Context>
Specify a JDBC datasource
<Resource name="jdbc/PmdDS"
auth="Container"
type="javax.sql.DataSource"
username="sdfsfsf"
password="sfsdfsdf" maxActive="-1"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://111.11.11.11:5432/test"/>
</Context>
请建议任何解决方案
答案 0 :(得分:2)
问题在于数据源的配置
最大连接数的默认值高于postgres中设置的最大数量,当hibernate要求另一个数据源尝试创建连接时。
您能否显示数据源的配置?
答案 1 :(得分:2)
(记录我采取同样问题的步骤)
maxActive
号码。SELECT * FROM pg_settings
- 查找max_connections
行。如果第一个数字大于第二个数字,则表示您遇到问题。降低第一个或增加第二个(在实例的postgresql.conf
中)。
另外,不要忘记为访问同一个数据库的其他服务器保留一些保留连接,以及一些数据库管理工具:)