繁体   English   中英

首次登录时无法为事务打开休眠会话

[英]Could not open Hibernate Session for transaction on First Login

我有一个使用 Spring Security 运行的完整运行的 Spring MVC 应用程序,但是每当服务器一段时间没有活动并且有人尝试登录时,我都会收到以下错误:

HTTP 状态 500 - 请求处理失败; 嵌套异常是 org.springframework.transaction.CannotCreateTransactionException: 无法打开 Hibernate Session 进行事务; 嵌套异常是 org.hibernate.TransactionException: JDBC begin transaction failed

有时(大约 5 秒后)它开始正常工作。

我搜索并找到了这个链接,但我不知道如何在连接池配置中配置连接测试。

有什么建议吗?

编辑:

我找到了这个链接来设置配置池,所以我尝试在我的dataSource实现它:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">

        <property name="driverClassName" value="com.mysql.jdbc.Driver" />

        <property name="url" value="jdbc:mysql://192.168.254.45:3306/7jogos" />
        <property name="password" value="..." />
        <property name="username" value="..." />


<!--      Configuration pool -->
        <property name="validationQuery" value="SELECT 1" />
        <property name="validationInterval" value="34000" />
        <property name="testOnBorrow" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="removeAbandonedTimeout" value="55" />


    </bean>

但我最终在validationInterval上得到一个错误说:

在这一行找到多个注释: - 在类“org.apache.commons.dbcp.BasicDataSource”中找不到属性“validationInterval”的setter

没有堆栈跟踪很难确定,但您很可能正在处理过期的数据库连接。 Hibernate 无法为您启动事务,因为它尝试运行的第一个语句(“START TRANSACTION - via JDBC)失败。我再次假设,因为在此期间底层数据库连接无效

发生这种情况的原因有多种:

  • 数据库设置(最有可能)
  • 网络/防火墙
  • 本地设置等

不管来源如何,您都可以选择确保不会发生这种情况。 如果您使用 JDBC 池(如Tomcat JDBC 池),您可以配置该池以测试并在必要时重新打开连接。 例如,testOnBorrow 设置将指示池在实际将其提供给应用程序使用之前不断测试数据库连接。 您可以微调这些设置以消除与性能相关的问题。

附加信息

您正在尝试很好地实现池化,但是变量名称:validationInterval 错误。

您收到该错误是因为 BasicDataSource 没有这样命名的变量,因此 Spring 无法设置该属性。 查看 BasicDataSource 的 javadoc( 链接),了解哪些配置变量可供您使用。 validationInterval 变量可以应用于 tomcat 池化实现(我上面建议的),您选择的那个没有这个功能。

代替

<property name="validationQuery" value="SELECT 1" />
<property name="validationInterval" value="34000" />
<property name="testOnBorrow" value="true" />
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="55" />

有了这个:

<property name="initialSize" value="10" />
<property name="maxActive" value="5" />
<property name="maxWait" value="5000" />

答案在我的编辑中,即在具有连接数据的 bean 中添加以下内容:

<!--      Configuration pool -->
        <property name="validationQuery" value="SELECT 1" />
        <property name="validationInterval" value="34000" />
        <property name="testOnBorrow" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="removeAbandonedTimeout" value="55" />

我不知道为什么,但 @Paweł Głowacz 的回答对我不起作用。 谢谢你们的帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM