加载中…
个人资料
好好先森V5
好好先森V5
  • 博客等级:
  • 博客积分:0
  • 博客访问:125,907
  • 关注人气:11
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

Laravel/Lumen漂亮的解决主从库延迟问题

(2016-09-06 10:14:02)
标签:

laravel

lumen

读写分离

延迟

主从延迟

5.5及以上版本:

连接配置sticky为true即可

5.4及以下版本:

app/Providers/AppServiceProvider增加boot方法,监听每条执行的SQL,如果发现DML语句(INSERT,UPDATE,DELETE)时,则清空从库连接的pdo(readPdo),这样由于Laravel底层安全机制,会默认使用主库连接。这样没有使用事务时,从根本上解决执行DML语句后,再执行DQL(SELECT)语句的延迟问题。

Laravel/Lumen Connection源码,当readPdo为null时,默认使用主库pdo实例。

public function getReadPdo()
{
  if ($this->transactions >= 1) {
return $this->getPdo();
}
return $this->readPdo ?: $this->pdo;
}

具体实现代码

Laravel/Lumen 5.1:

public function boot()
{
\DB::listen(function ($sql$bindings$time$connection) {
$sql ltrim($sql);
if (stripos($sql'insert'=== 0
|| stripos($sql'update'=== 0
|| stripos($sql'delete'=== 0
) {
\DB::connection($connection)->setReadPdo(null);//清空从库连接, 自动使用主库连接
}
});
}


Laravel/Lumen 5.2:


public function boot()
{
\DB::listen(function (QueryExecuted $executed) {
  $executed->sql = ltrim($executed->sql);
if (stripos($executed->sql, 'insert') === 0
|| stripos($executed->sql, 'update') === 0
|| stripos($executed->sql, 'delete') === 0
) {
\DB::connection($executed->connection)->setReadPdo(null);//清空从连接,会自动使用主连接
}
});
}

另,附上主从数据库配置(多台读库配置)
'read' => [
                [
                    'host' => env('DB_TEST_READ_HOST1', '192.168.0.2'),
                    'port' => env('DB_TEST_READ_PORT1', 3306),
                ],
                [
                    'host' => env('DB_TEST_READ_HOST2', '192.168.0.3'),
                    'port' => env('DB_TEST_READ_PORT2', 3306),
                ],
            ],
            'write'     => [
                [
                    'host' => env('DB_TEST_WRITE_HOST', '192.168.0.1'),
                    'port' => env('DB_TEST_WRITE_PORT', 3306),
                ],
            ],

enjoy...

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有