请求有时会出现 MySQL server has gone away

awen

问题描述

如图:
截图
同样的接口请求前两次都出现General error: 2006 MySQL server has gone away, 但实际mysql并没有挂,其他接口也正常运行。
报错的接口第三次再请求也正常了,这是什么原因?

164 4 0
4个回答

看下mysql启动时间,可能在重启

  • awen 5天前

    应该没有重启

  • awen 5天前

    我们这是个saas系统,租户的数据库是同一实例不的数据库,比如:tenant_1,tenant_2... 这样分开,我们自己写个全局中间件,根据传来的租户ID来动态选择数据库连接,我想会不会是中间件的问题?

awen

截图
应该没重启

  • 暂无评论

从报错看只知道mysql连接被mysql服务端断开了,具体为什么断开从给的信息中无法判断,看下mysql日志是否有有用的信息。这个问题需要自己定位下,从提供的信息中看其他人帮不上什么忙。

  • 暂无评论
awen

大佬帮我简单看一眼,这代码有没有问题

截图

截图

public static function getInstance($config = [])
{
if (self::$instance === null) {
self::$instance = new self($config);
self::$instance->capsule = new Capsule(IlluminateContainer::getInstance());
self::$instance->config = $config;
}
return self::$instance;
}

/**
 * 构建数据库连接
 * @param int $tenantId 租户id
 * @return \Illuminate\Database\Connection
 */
public function buildConnection(int $tenantId = 0)
{
    $method = config('plugin.yesgooo.dynamic-database-manager.conf.method') ?? 'header';
    //如外部指定租户直接取指定值,否则从请求头部获取当前租户标识,默认0
    $flag = $tenantId ?: \request()->$method(config('plugin.yesgooo.dynamic-database-manager.conf.flag'), 0);

    //当前公司数据库名称,如未传公司ID取默认配置数据库名
    $database = $flag ? config('plugin.yesgooo.dynamic-database-manager.conf.database_prefix').$flag : config('plugin.yesgooo.dynamic-database-manager.conf.default_database');

    //当前的数据库连接名称
    $curConnect = $flag ? config('plugin.yesgooo.dynamic-database-manager.conf.conn_prefix') . $flag : 'default';

    $config = $this->config ?: [
        'driver' => 'mysql',
        'host'        => config('plugin.yesgooo.dynamic-database-manager.conf.host'),
        'port'        => config('plugin.yesgooo.dynamic-database-manager.conf.port'),
        'database'    => $database,
        'username'    => config('plugin.yesgooo.dynamic-database-manager.conf.username'),
        'password'    => config('plugin.yesgooo.dynamic-database-manager.conf.password'),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
    ];

    $defaultConnect = $this->capsule->getDatabaseManager()->getDefaultConnection();

    //通过容器获取全部数据库连接
    $allConnect = $this->capsule->getContainer()['config']['database.connections'];

    //如果当前连接还没有,则新增连接
    if(!in_array($curConnect, array_keys($allConnect))){
        $this->capsule->addConnection($config, $curConnect); // TODO: Change the autogenerated stub
    }

    //如果默认连接不是当前连接,则设置成默认连接
    if($defaultConnect != $curConnect){
        //断开当前连接 2023-12-13
        $this->capsule->getDatabaseManager()->disconnect();
        //重置默认连接
        $this->capsule->getDatabaseManager()->setDefaultConnection($curConnect);
    }

    $this->capsule->setAsGlobal();

    $this->capsule->bootEloquent();
}
  • walkor 5天前

    你这个是自己做的数据库接入,没用webman自带的,webman自带的有数据库心跳,你的没看到哪里有心跳,所以mysql连接会断开。
    下次提问的时候把相关信息说清楚,这样大家节省时间。

  • awen 5天前

    谢谢大佬回复,自带的因为没有看到怎么实现切换数据库,所以就自己研究了下做了个插件。自带数据库颤抖有方法实现切换数据库吗

  • walkor 5天前

    如果你的数据库是同一个ip端口可以在中间件里用 use database 语句切换数据库

×
🔝