【问题标题】:sybase and jdbc. Could not commit jdbc transaction. Read time outsybase 和 jdbc。无法提交 jdbc 事务。阅读超时
【发布时间】:2018-02-12 23:28:59
【问题描述】:

在我的应用在几分钟后尝试提交许多事务后,我收到以下异常:

无法提交 jdbc 事务嵌套异常是 java.sql.sqlexception: jz006: 捕获 ioexception: java.net.SocketTimeoutException: 读取超时..."

我正在使用带有 Spring JDBC 的 JDBC 4 驱动程序的 Sybase,我找到了这个链接:http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc39001.0707/html/prjdbc0707/prjdbc070714.htm 我可以使用以下任何一种吗:

SESSION_TIMEOUT
DEFAULT_QUERY_ TIMEOUT
INTERNAL_QUERY_TIMEOUT

一个想法是批量进行交易,但我没有时间开发它。 有哪些选择可以避免出现该错误?

【问题讨论】:

    标签: jdbc transactions sybase spring-jdbc sybase-asa


    【解决方案1】:

    检查您的进程在执行时是否相互阻塞(如果您不确定如何检查,请询问您的 DBA)。根据连接属性(特别是自动提交设置为关闭),您可能实际上并未在尝试下一个事务之前完全提交每个事务,并且如果您使用具有多个线程的连接池,它们可能会相互阻塞。与您的 DBA 交谈并检查表的锁定方案,例如,如果它设置为所有页锁定,您将在页面而不是数据的行级别持有锁。您也可以通过 sp_help 自行检查。有关各种类型的锁定方案的更多信息可以在http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc20021_1251/html/locking/X25549.htm 找到(旧版本,但在当前版本中仍然有效)。

    您可以通过 sp_who、sp_lock 或直接针对系统表检查锁(选择 spid,从 master 阻塞..sysprocesses where blocked !=0 是一个非常简单的获取进程和阻塞进程的方法,您可以添加更多列根据需要对此进行处理)。

    您还应该要求您的 DBA 检查事务是否最佳,例如更新时的表扫描很可能会将整个表锁定到其他事务,并会导致您在此处看到的超时问题。

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 2013-01-09
      • 2021-01-20
      • 1970-01-01
      • 2023-03-19
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多