当前位置: 首页 > 知识库问答 >
问题:

首次登录时无法打开事务的Hibernate会话

子车心思
2023-03-14

我有一个运行完整的Spring MVC应用程序,运行Spring Security,但每当服务器有一段时间不活动,有人试图登录时,我就会出现以下错误:

HTTP状态500-请求处理失败;嵌套的异常是org。springframework。交易CannotCreateTransactionException:无法为事务打开Hibernate会话;嵌套的异常是org。冬眠TransactionException:JDBC begin事务失败

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

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

有什么建议吗?

编辑:

我找到这个链接来设置配置池,所以我尝试在我的数据源中实现它:

<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”中未找到属性“validationInterval”的setter。阿帕奇。平民dbcp。基本数据源'


共有3个答案

仰经武
2023-03-14

答案在我的编辑中,即在我的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" />

我不知道为什么,但是@Pawegóowacz的回答对我不起作用。谢谢你们的帮助伙计们

金皓君
2023-03-14

代替

<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" />
吕亮
2023-03-14

如果没有stacktrace,很难确定,但您很可能正在处理过期的DB连接。Hibernate无法为您启动事务,因为它尝试运行的第一条语句(“start transaction-via JDBC”)失败。

由于各种原因,这可能会发生:

  • 数据库设置(最有可能)

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

其他信息

您试图实现池,但变量名validationInterval搞错了。

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

 类似资料:
  • Spring MVC+Hibernate、JavaConfig WebAppConfig: 用户 HTTP状态500-请求处理失败;嵌套异常为org.springframework.transaction.CanNotCreateTransactionException:无法打开事务的Hibernate会话;嵌套异常为java.lang.NoClassDefoundError:org/hibern

  • 有关您编写的代码问题的问题必须描述特定问题-并且在问题本身中包含有效代码以重现它。有关指导,请参阅SSCCE. org。 在我的应用程序中,我有一个模块,用于在数据库中搜索用户并在jsp内的表中显示他们的信息。我只是在应用程序中设置了Spring Security性。我能够从登录页面连接到数据库,尽管出于某种原因,DAO的CRUD操作(在本例中是搜索)都不起作用。 谢谢,如果我能提供更多信息,请告

  • 我不熟悉SpringMVC和Hibernate。尝试使用SpringMVC(4.0.3)、Hibernate(4.3.5)和MySQL作为后端创建一个测试web应用程序。 连接到DB没有问题,因为我尝试使用简单的JDBC连接语句从示例testJavaClass中的同一个DB中获取数据,并且能够获取记录。 错误日志: 这是我的pom。xml: Eclipse中的项目结构: servlet上下文。xm

  • 错误日志: 冬眠图。JAVA 测试类CategoryTestCase。JAVA 为什么我无法为事务打开Hibernate会话;嵌套异常,似乎一切都很好,为什么我得到这个错误你也可以检查git Hub代码它的相同问题,请帮助我解决这个问题https://github.com/rustyamigo/online-shopping

  • HibernateConfig CategoryDAOImpl 类别 类别测试类 获取此错误 为什么我得到嵌套异常 无法打开事务的Hibernate会话 似乎一切都很好,为什么会出现这个错误? 您也可以检查github代码

  • 问题内容: 这些方法之间有什么区别,哪种更好?到现在为止,我的代码如下: 但是在运行上述代码时,记录并不总是被删除(精确地:id = 1永远不会被删除,而其他id总是被删除)。我读到保持打开的会话可以稍微加快应用程序的速度- 这就是为什么我要共享会话对象。我的业务对象通过DI获取会话工厂: 问题答案: 根据我在Hibernate的经验,得出的结论是,最好的策略是使Hibernate会话寿命与单个事