如图: 同样的接口请求前两次都出现General error: 2006 MySQL server has gone away, 但实际mysql并没有挂,其他接口也正常运行。 报错的接口第三次再请求也正常了,这是什么原因?
看下mysql启动时间,可能在重启
应该没有重启
我们这是个saas系统,租户的数据库是同一实例不的数据库,比如:tenant_1,tenant_2... 这样分开,我们自己写个全局中间件,根据传来的租户ID来动态选择数据库连接,我想会不会是中间件的问题?
应该没重启
从报错看只知道mysql连接被mysql服务端断开了,具体为什么断开从给的信息中无法判断,看下mysql日志是否有有用的信息。这个问题需要自己定位下,从提供的信息中看其他人帮不上什么忙。
大佬帮我简单看一眼,这代码有没有问题
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(); }
你这个是自己做的数据库接入,没用webman自带的,webman自带的有数据库心跳,你的没看到哪里有心跳,所以mysql连接会断开。 下次提问的时候把相关信息说清楚,这样大家节省时间。
谢谢大佬回复,自带的因为没有看到怎么实现切换数据库,所以就自己研究了下做了个插件。自带数据库颤抖有方法实现切换数据库吗
如果你的数据库是同一个ip端口可以在中间件里用 use database 语句切换数据库
use database
看下mysql启动时间,可能在重启
应该没有重启
我们这是个saas系统,租户的数据库是同一实例不的数据库,比如:tenant_1,tenant_2... 这样分开,我们自己写个全局中间件,根据传来的租户ID来动态选择数据库连接,我想会不会是中间件的问题?
应该没重启
从报错看只知道mysql连接被mysql服务端断开了,具体为什么断开从给的信息中无法判断,看下mysql日志是否有有用的信息。这个问题需要自己定位下,从提供的信息中看其他人帮不上什么忙。
大佬帮我简单看一眼,这代码有没有问题
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;
}
你这个是自己做的数据库接入,没用webman自带的,webman自带的有数据库心跳,你的没看到哪里有心跳,所以mysql连接会断开。
下次提问的时候把相关信息说清楚,这样大家节省时间。
谢谢大佬回复,自带的因为没有看到怎么实现切换数据库,所以就自己研究了下做了个插件。自带数据库颤抖有方法实现切换数据库吗
如果你的数据库是同一个ip端口可以在中间件里用
use database
语句切换数据库