多个程序访问一个数据库出现死锁,怎么处理?

良少
博客专家认证
2007-12-04 05:08:32
我们有2个程序访问同一个数据库。一个是用Spring+iBatis 访问数据库,我写的程序使用Hibernate+C3p0的数据库连接池访问。 数据库是MySQL。
现在,我这边经常报错。 显示数据库死锁, 无法同步事务的状态。

请问各位,在这种情况下是怎么处理的?


经常出现下面的警告信息:
2007-12-03 21:14:07,453 WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner] - Task com.mchange.v2.c3p0.stmt.GooGooStatementCache$1@2e0dcb (in deadlocked PoolThread) failed to complete in maximum time 60000ms. Trying interrupt().

然后是出错信息:
2007-12-03 21:14:41,984 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 1205, SQLState: 41000
2007-12-03 21:14:41,984 ERROR [org.hibernate.util.JDBCExceptionReporter] - Lock wait timeout exceeded; try restarting transaction
2007-12-03 21:14:41,984 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] - Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at com.withub.adserver.frontserver.persistent.service.traceMessage.TraceMessageService.saveTX(TraceMessageService.java:61)
at com.withub.adserver.frontserver.frontserver.nio.server.interpreter.BaseMessageInterpreter.saveTraceMessage(BaseMessageInterpreter.java:372)
at com.withub.adserver.frontserver.frontserver.nio.server.interpreter.BaseMessageInterpreter.checkAndTraceMessage(BaseMessageInterpreter.java:149)
at com.withub.adserver.frontserver.frontserver.nio.server.interpreter.ClientREQWatchHardwareState.interpreter(ClientREQWatchHardwareState.java:72)
at com.withub.adserver.frontserver.frontserver.runnable.DealRequsetWorker.dealRequest(DealRequsetWorker.java:162)
at com.withub.adserver.frontserver.frontserver.runnable.DealRequsetWorker.run(DealRequsetWorker.java:226)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction
at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:656)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
... 16 more
...全文
1726 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
csbudong 2010-07-31
  • 打赏
  • 举报
回复
都是07年的帖子啦,感动啊, 哥们我也遇到了和你一样的问题,我有2个TOMCAT服务器访问同一个数据库,也经常出现了 ERROR [org.hibernate.util.JDBCExceptionReporter] - Lock wait timeout exceeded; try restarting transaction 哈哈, 我用的 程序使用Hibernate+C3p0的数据库连接池访问。 数据库是MySQL。 跟你的一样的,幸会啊。

你说的“找到问题了。关闭c3p0的preparedStatement缓存就可以了”

是不是将max_statements 设置成0 就OK啦, 我先去尝试一下。

良少 2007-12-10
  • 打赏
  • 举报
回复
找到问题了。关闭c3p0的preparedStatement缓存就可以了
lifenglijun 2007-12-10
  • 打赏
  • 举报
回复
我遇到过,可。。。。。
良少 2007-12-06
  • 打赏
  • 举报
回复
大家随便讨论讨论嘛! 难道没有人遇到过多个程序访问同一个数据库的情况?
flyforlove 2007-12-05
  • 打赏
  • 举报
回复
设置你的事物隔离级别
zhb_821012 2007-12-05
  • 打赏
  • 举报
回复
死锁?
跟2个程序访问数据库没关系吧
是程序问题
良少 2007-12-05
  • 打赏
  • 举报
回复
死锁,应该是我和同事的程序都使用事务有关。 互相锁住了对方需要的记录。 如果把事务的级别订得越高,会不会出现更频繁的死锁?
良少 2007-12-04
  • 打赏
  • 举报
回复
没人知道吗? 可以说一下怎样处理这种多个程序访问一个数据库的策略吗?
对了,我的程序是没有用户界面的,这样即使发生了死锁,我也无法处理!

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧