我的应用尝试在几分钟后尝试提交许多交易后,我遇到以下异常:
无法提交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
一个想法是批量进行交易,但我没有时间进行开发。 有哪些选项可以避免出现错误?
答案 0 :(得分:0)
检查您的进程在执行时是否相互阻塞(如果您不确定如何检查,请询问您的DBA)。根据连接属性(特别是自动提交设置为关闭),您可能实际上不会在尝试下一个事务之前完全提交每个事务,如果您使用的是具有多个线程的连接池,它们可能会相互阻塞。与您的DBA交谈并检查表的锁定方案,例如,如果将其设置为allpages锁定,您将在页面上保持锁定而不是行级别的数据。您也可以通过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,其中被阻止!= 0是一个非常简单的获取进程和阻塞过程,您可以添加更多列按要求)。
您还应该要求您的DBA检查事务是否是最佳的,例如更新中的表扫描可能会将整个表锁定到其他事务,并且会导致您在此处看到的超时问题。