关于“数据或者资源可以全局共享”

0

workerman的优点中有一条“数据或者资源可以全局共享”,请问怎么实现?我想在Event.php中用mysql_connect()创建一个数据连接$db_conn,然后后面有新的连接进来时,可以不用再次连接,如何做?是否用一个在Event 或者Gateway class中声明一个static $db_conn = null,然后做一个初始化就行了?

已邀请:

walkor

赞同来自:

可以写一个数据库的类,然后使用单例模式,类似下面这样


class DB
{
static $dbConn = null;
public static function instance()
{
if(!self::$dbConn)
{
self::$dbConn = new PDO(xxxx);
}
}
}

数据库资源全局共享时有一点需要注意,当这个共享的数据库链接长时间没有任何操作时可能会被mysql服务端关闭链接,被mysql服务端关闭链接后的数据库资源再次被使用的时候会报mysql gone away 错误,使用时如果遇到这种错误(错误码为2006)重连即可

ayamzh

赞同来自:

那是不是我使用MYSQL_PCONNECT 可以避免这种断开连接后的判断了。每次用户名密码一样用相同的句柄链接?

walkor

赞同来自:

如果用持久的mysql资源,都会有服务端关闭不活跃链接的问题,都需要判断。


对性能要求不高的应用可以不使用持久资源。每次使用数据库重新创建一个链接

ayamzh

赞同来自:

学习了。那redis用单例模式加载的话 会不会也存在myql gone away需要重连这类似问题。

walkor

赞同来自:

redis底层会自动重连,但是按照经验来看,redis扩展底层的重连并十分不可靠,还是有连不上的状况。最好是在底层判断下异常,然后重连重试一次。

要回复问题请先登录注册