class EDatabaseError with message 'Invalid data packet'

  最近在重构一个项目的代码,重构完后调试老是会出现访问数据库异常。提示是‘Invalid data packet’。

  起初,我以为是数据库操作的语句出了问题,就把对应出现异常的语句放到oracle的SQL窗执行,是正常的。

  在网上找了很多帖子,都没有找到答案。后来根据调试中出现的问题,当一个数据库操作异常后,紧接接另一个数据库操作也会异常。然后在出错的地方连续打了好几个断点,调试中发现,一个接口还没运行完就跑去执行另一个接口的其它语句转而回来再继续当前接口的执行。然后我才发现这是多线程惹的祸。

  重构之前对数据库的执行都是单线程的,没有出现此类异常,重构后有此异常,我有怀疑过是多线程问题。只是,当时发起数据库操作的是多线程,用的是SendMessage方法,但是发起操作是用消息的方式发给主线程,让主线程统一操作。由此,才会觉得这种数据库的操作方式不属于多线程。不料,这是SendMessage埋的坑,虽然此消息都发给主线程,但是发起的线程也都要等待消息执行完,在此处调试看来仍然是多线程的。

  解决方法:在需要发起数据库操作的方法里用上线程锁,保证数据库操作的发起互斥,问题解决。

 

转载于:https://www.cnblogs.com/kamiya/p/9552473.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值