【问题标题】:Timeout implementation of JPA transactions and Session invalidationJPA 事务和会话失效的超时实现
【发布时间】:2014-05-20 07:29:44
【问题描述】:

我一直在处理一个使用 wicket+JPA+springs 技术的应用程序。最近我们在日志中收到许多 5XX 错误(大于阈值)。在那段时间,由于我们的应用程序的后端 mainframe db2 的响应时间不稳定,存在一些一般性问题。 但是在主机好了之后这个应用服务器就再也没有恢复正常了。

有很多挂起的交易(来自我的应用程序)。 服务器中有很多线程可能被挂起。 由于用户将继续保持登录状态或在此期间访问应用程序中的链接,情况会变得更糟。

当我查看 webspehere 日志时,我发现了以下异常:

00000035 ThreadMonitor W WSVR0605W: Thread "WebContainer : 88" (000005ac)
has been active for 637111 milliseconds and may be hung. 
There is/are 43 thread(s) in total in the server that may be hung. 

在应用程序日志中我发现以下异常:

-->CouldNotLockPageException: Could not lock page 4. Attempt lasted 3 minutes
-->DefaultExceptionMapper - Connection lost, give up responding.
   org.apache.wicket.protocol.http.servlet.ResponseIOException:
   com.ibm.wsspi.webcontainer.ClosedConnectionException: OutputStream encountered error during  
   write.
--> JDBCExceptionReporter - [jcc][t4][2030][11211][3.67.27] A communication error occurred
   during operations on the connection's underlying socket, socket input stream, 
   or socket output stream. 
   Error location: Reply.fill() - socketInputStream.read (-1).  Message: 
   Connection reset. ERRORCODE=-4499, SQLSTATE=08001DSRA0010E: SQL State = 08001, Error Code = -       4.499

现在我们正在研究这个问题的解决方案。以下是我们目前正在考虑的两个解决方案。

1.我翻了很多论坛,发现每次遇到CouldNotLockPageException时,最好是invaidate session,强制用户登录页面。目前我们没有session invalidation(logout)机制,所以我们会实现那个。

2.我们需要实现事务超时,以便我们可以停止挂起事务。

我需要从 java 或服务器端解决这个问题。这里我们使用 wicket、jpa 和 springs 框架。我有几个问题。

1.我们如何在上述框架中实现事务超时?

2.无效会话是否可以停止挂起可能挂起的事务或线程?

【问题讨论】:

    标签: java spring hibernate jpa transactions


    【解决方案1】:

    既然你已经在使用 Spring,那就这么简单:

    @Transactional(timeout = 300)
    

    事务注释允许您提供超时值(以秒为单位),事务管理器会将其转发到 JTA 事务管理器或您的数据源连接池。它与 Bitronix 事务管理器配合得很好,它会自动拾取它。

    您还需要确保始终关闭 java.sql.Conenction 并且始终提交事务(当所有操作成功时)或在失败时回滚。

    使用户 http 会话无效与 jdbc 连接无关。您的 jdbc 连接应始终提交/回滚并关闭(在连接池的情况下,将释放与池的连接)。

    并确保最大池大小不大于 tour db max concurrent connections 设置。

    【讨论】:

    • timeout 元素的默认值为 -1:defaults to the default timeout of the underlying transaction system。为底层事务系统指定默认值不是更容易吗(一次永远)?否则可能是这样,应该更改许多代码行...
    • @Sudheer 使用户 http 会话无效与 jdbc 连接无关。您的 jdbc 连接应始终提交/回滚并关闭。
    • @SudheerKumarS 检查 maxPoolSize,如果 Spring 用于 DBCP,请检查那里的池大小。 db2服务器拒绝连接可能是连接池的原因。
    • 这很简单。只需确保最大池大小不大于 db2 max concurrent connections 设置。
    • @SudheerKumarS commons.apache.org/proper/commons-dbcp/configuration.html 查看 maxTotal 属性。
    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 2015-01-20
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    相关资源
    最近更新 更多