0

有些全协程版本的swoole应用,比如easyswoole3.x,无法直接使用think-orm,laravel-orm等单例数据库orm。我这里有个钻牛角尖的那种为什么?想请教一下

比如,我已经知道。

  1. 多个协程共用一个Mysql实例,会导致数据错乱。(为什么会?)
  2. 一个socket会话只能有一个链接实例。 (为什么只能有一个?)
  3. 单例ORM中数据库链接会自动断开。 (为什么会自动断开?)
  4. 如果不实用连接池等技术手段,是不是每个会话查询数据库都要判断是否已链接,如果没链接马上进行链接? 并且链接之后要销毁链接,也就是close掉??
菜问 450
2019-04-29 提问

1 个回答

1

已采纳

1.多个协程共用一个Mysql实例,会导致数据错乱。(为什么会?)

SWOOLE单个进程如果用到了单例,并不会按照我们传统方式按照先后顺序执行。打个比方,读写文件没有锁,那么同时多人读写一个文件内容,内容是否会出现错乱?每个协程去操作数据库的时候,可能另外一个协程还没有完成完整的数据库操作,比如A开启了事务,正在执行一些逻辑计算和数据修改,这时另外一个协程B也需要使用使用,但是此时是提交事务,那么A没有执行完,但是用了同一链接,是不是事务就会被提交。
  1. 一个socket会话只能有一个链接实例。 (为什么只能有一个?)

不是啊,是多个链接通过libevent就实现了多链接,SWOOLE底层就是基于这个

  1. 单例ORM中数据库链接会自动断开。 (为什么会自动断开?)

这个是MYSQL设置的,修改MYSQL的配置信息可以延长断开时间,但是同样会增加MYSQL的资源消耗

  1. 如果不实用连接池等技术手段,是不是每个会话查询数据库都要判断是否已链接,如果没链接马上进行链接? 并且链接之后要销毁链接,也就是close掉??

可以不判断直接执行,根据返回值来判断是否成功或者链接已经断开具体可以看一些库的源码,比如TP,就支持断线重连

推广链接