class EDatabaseError with message 'Invalid data packet'

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

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/kamiya/p/9552473.html
今日推荐