Laravel 使用Voyager导致多个数据库连接总是返回默认连接?
问题与分析
最近的项目碰到一个奇怪的问题,在Laravel(5.3)中想建立多个数据库连接连到MySQL的不同数据库(另一个连接名为conn2
),执行如下语句得到却发现得到的仍然是默认连接:
$conn2 = DB::connection("conn2");
百思不得其解,只好去啃源码,最后定位到vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php
文件的createConnection
这个函数,源码如下:
/**
* Create a new connection instance.
*
* @param string $driver
* @param \PDO|\Closure $connection
* @param string $database
* @param string $prefix
* @param array $config
* @return \Illuminate\Database\Connection
*
* @throws \InvalidArgumentException
*/
protected function createConnection($driver, $connection, $database, $prefix = '', array $config = [])
{
//以mysql为例,下面这句的意思就是如果检测到名为db.connection.mysql的Container,那么就返回该Container。测试发现总是进入该分支,也就是说明某个模块注册了该名称的Container以致不能创建多个连接。
if ($this->container->bound($key = "db.connection.{$driver}")) {
return $this->container->make($key, [$connection, $database, $prefix, $config]);
}
switch ($driver) {
case 'mysql':
return new MySqlConnection($connection, $database, $prefix, $config);
case 'pgsql':
return new PostgresConnection($connection, $database, $prefix, $config);
case 'sqlite':
return new SQLiteConnection($connection, $database, $prefix, $config);
case 'sqlsrv':
return new SqlServerConnection($connection, $database, $prefix, $config);
}
throw new InvalidArgumentException("Unsupported driver [$driver]");
}
问题就出在第一句的判断上,测试发现总是能进入分支,说明某个模块注册了提供了db.connection.mysql
的Container。最后查到是由于安装了第三方包Voyager
引起的。
Voyager
注册了一个名为Larapack\DoctrineSupport\DoctrineSupportServiceProvider
(也不知道干嘛的,也没看到在使用),看下DoctrineSupportServiceProvider
的源码,可以找到确实注册了db.connection.mysql
的单例Container
。
/**
* Register MySQL database connection.
*/
protected function registerMySqlDatabaseConnection()
{
$this->app->singleton('db.connection.mysql', function ($app, $parameters) {
// First, we list the passes parameters into single
// variables. I do this because it is far easier
// to read than using it as eg $parameters[0].
list($connection, $database, $prefix, $config) = $parameters;
// Next we can initialize the connection.
$connection = new MySqlConnection($connection, $database, $prefix, $config);
// Add Doctrine types for better support
$this->addDoctrineTypes($connection);
$connection->setSchemaGrammar(new MySqlGrammar());
return $connection;
});
}
解决方法
将vendor/tcg/voyager/src/VoyagerServiceProvider.php
复制一份到app/Providers/
,修改命名空间为App\Providers
,并将DoctrineSupport
相关行都删除。然后修改下config/app.php
,将TCG\Voyager\VoyagerServiceProvider::class
修改为App\Providers\VoyagerServiceProvider::class
就解决了。
Laravel 使用Voyager导致多个数据库连接总是返回默认连接?的更多相关文章
- C#中SQL Server数据库连接池使用及连接字符串部分关键字使用说明
(1) 数据库的连接使用后,必须采用close()连接等效的方法关闭连接.只有关闭后,连接才能进入连接池. 参见微软的使用连接池说明:https://msdn.microsoft.com/zh-cn/ ...
- Oracle :一次数据库连接,返回多个结果集
1. 一次数据库连接,返回多个结果集 1.1 建立包规范 create or replace package QX_GDJTJ is -- Author : xxx -- Created : 2012 ...
- MySQL数据库连接重试功能和连接超时功能的DB连接Python实现
def reConndb(self): # 数据库连接重试功能和连接超时功能的DB连接 _conn_status = True _max_retries_count = 10 # 设置最大重试次数 _ ...
- mysql autocommit=OFF导致wordpress 建立数据库连接时出错
今天安装wordpress完成后跳转到login页面时,出现建立数据库连接时出错.网上清一色的拷贝http://mt.sohu.com/20160917/n468547634.shtml的答案. 只能 ...
- Laravel attribute casting 导致的 Indirect modification of overloaded property
在 Laravel model 中,设置了某个属性做 array casting. protected $casts = [ 'rounds' => 'array', ]; 但是在 contro ...
- 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 数据库连接不释放测试 连接池 释放连接 关闭连接 有关 redis-py 连接池会导致服务器产生大量 CLOSE_WAIT 的再讨论以及一个解决方案
import pymysqlfrom redis import Redisimport time h, pt, u, p, db = '192.168.2.210', 3306, 'root', 'n ...
- laravel EncryptCookies中间件导致无法获取自定义cookie
解决办法: \app\Http\Middleware\EncryptCookies.php 添加过滤cookie key protected $except = [ 'token' ];
- sql中数据库连接与断开式连接有什么区别?
连接式指的是对数据的操作在 conn.Open() 与 conn.Close()之间: 断开式连接指的是 conn.Open()打开连接之后,先将数据放入adapter中,然后关闭连接(conn.Cl ...
- Laravel 命令行工具之多线程同步大批量数据 DB连接混乱 解决方案
记一次大批量数据的多进程同步 背景:因为公司的用户标识不完整,所以需要从集团同步一次用户标记数据,用户数据来源是微信,数量级为一百五十万,集团用户数量级为六百万 方案确定下来是集团开了一个查询接口,访 ...
随机推荐
- MYSQL ZIP 压缩包 安装
基win10安装 1.管理员身份打开cmd 2.进入mysql 的 bin文件下 D: 回车 3.mysql服务名字 -install 回车 4.net start mysql服务名字 ...
- node.js 转载:有效
二.安装Node.js步骤 1.下载对应你系统的Node.js版本:https://nodejs.org/en/download/2.选安装目录进行安装3.环境配置4.测试 三.前期准备 1.Node ...
- [To Selina] 《撒野》读后感
- scrapy框架基于CrawlSpider的全站数据爬取
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
- PHP内核研究 静态变量
静态变量 它可以是 静态全局变量,如果不调用unset,那么这个静态变量会一直存在,直到程序退出时才由Zend内存管理来释放 它可以是 静态局部变量:在函数里定义,函数执行完后,该静态变量不会消失 它 ...
- codis__数据迁移和伸缩容
数据迁移命令 注意点:是迁移到某个 redis-group 而不是某个redis-servers 实例 伸缩容用法 redis 内存等不够用时 增容 : 增加redis-group, 然后迁移使用上 ...
- 多行select中的数据展示和单个删除
/** 删除多选select中 的某个值,公共方法 只适用于同级节点下只有一个select的情况 v 此按钮,this _id,option中的value的name属性 _name,option中的t ...
- 2019.2.14 t2 程序调试
代码: #include <cstdio> #include <iostream> #include <cstring> #include <algorith ...
- Log中关于start meeting在zVideoApp和zVideoUI中的流程可以搜索的几个字符串
[31356:36164:04-29/17:53:38.164:INFO:SBConfUI.cpp(940)] CSBConfUI::OnConfStatusChanged(CONF_STATUS) ...
- Ubuntu下Nginx安装
1.1 安装Nginx $sudo apt-get install nginx Ubuntu安装之后的文件结构大致为: 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/ ...