怎么在 Laravel 的 Model 里加数据库连接池?

最近看了golang的数据库连接驱动,默认会创建个数据库连接池。
所以我想laravel框架现在应该是直连数据库的,QPS压力很大!

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

這要看你給 Eloquent 的 Driver。

從 PHP 的角度來講,有四種方法可以實現 Database Connection Pooling

  1. MSSQL pconnect(在 PHP 7.0 被移除,應該用 PDO 取代)
  2. PDO 的 ATTR_PERSISTENT
<?php
    $dbh = new PDO(PDO_DSN, USERNAME, PASSWORD, [
        PDO::ATTR_PERSISTENT => true,
    ]);

這種方法可以用 PDO 建立長連線(不間斷連線)

在 Laravel 中可以這樣設定

// config/database.php

return [
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            // ...
            'prefix'    => '',
            'options'   => [
                PDO::ATTR_PERSISTENT => true,
            ],
        ],
    ],
];

不過官方也有說明,如果 driver 支援長連接(例如 ODBC)就用 ODBC 原生的方法做,因為這樣不僅能讓單一應用程式使用 Connection Pooling,也能以 Process 的方式共享 Connection Pooling

  1. ODBC Connection Pooling

前提是 ODBC 的 driver 跟 library 有支援,然後直接把 driver 改成 ODBC,然後用 PDO_ODBC 去連接資料庫,記得在 php.ini 中設定 pdo_odbc.connection_pooling=strict/relaxed/off

  1. freeTDS

這是在網路上看到的做法,它是利用 linux process 去管理 connection,不確定現在還能不能用

結論

最簡單的做法是直接在 config/database.php 中加入一個 options,不過如果同一台伺服器上有超多個 connection 需求(建置有多個服務的話)那記憶體或磁碟 IO 使用量會很可觀。

比較複雜但完善的解決方法是使用支援 Connection Pooling 的 ODBC Driver,好處是不僅只限連接 MySQL,也可以無痛擴充連接 MSSQl 或 Oracle SQL(除了 SQL 語法之外的無痛),壞處是建置成本比較高(需要花點時間摸索跟研究)

6年前 评论
讨论数量: 3

這要看你給 Eloquent 的 Driver。

從 PHP 的角度來講,有四種方法可以實現 Database Connection Pooling

  1. MSSQL pconnect(在 PHP 7.0 被移除,應該用 PDO 取代)
  2. PDO 的 ATTR_PERSISTENT
<?php
    $dbh = new PDO(PDO_DSN, USERNAME, PASSWORD, [
        PDO::ATTR_PERSISTENT => true,
    ]);

這種方法可以用 PDO 建立長連線(不間斷連線)

在 Laravel 中可以這樣設定

// config/database.php

return [
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            // ...
            'prefix'    => '',
            'options'   => [
                PDO::ATTR_PERSISTENT => true,
            ],
        ],
    ],
];

不過官方也有說明,如果 driver 支援長連接(例如 ODBC)就用 ODBC 原生的方法做,因為這樣不僅能讓單一應用程式使用 Connection Pooling,也能以 Process 的方式共享 Connection Pooling

  1. ODBC Connection Pooling

前提是 ODBC 的 driver 跟 library 有支援,然後直接把 driver 改成 ODBC,然後用 PDO_ODBC 去連接資料庫,記得在 php.ini 中設定 pdo_odbc.connection_pooling=strict/relaxed/off

  1. freeTDS

這是在網路上看到的做法,它是利用 linux process 去管理 connection,不確定現在還能不能用

結論

最簡單的做法是直接在 config/database.php 中加入一個 options,不過如果同一台伺服器上有超多個 connection 需求(建置有多個服務的話)那記憶體或磁碟 IO 使用量會很可觀。

比較複雜但完善的解決方法是使用支援 Connection Pooling 的 ODBC Driver,好處是不僅只限連接 MySQL,也可以無痛擴充連接 MSSQl 或 Oracle SQL(除了 SQL 語法之外的無痛),壞處是建置成本比較高(需要花點時間摸索跟研究)

6年前 评论

這要看你給 Eloquent 的 Driver。

從 PHP 的角度來講,有四種方法可以實現 Database Connection Pooling

  1. MSSQL pconnect(在 PHP 7.0 被移除,應該用 PDO 取代)
  2. PDO 的 ATTR_PERSISTENT
<?php
    $dbh = new PDO(PDO_DSN, USERNAME, PASSWORD, [
        PDO::ATTR_PERSISTENT => true,
    ]);

這種方法可以用 PDO 建立長連線(不間斷連線)

在 Laravel 中可以這樣設定

// config/database.php

return [
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            // ...
            'prefix'    => '',
            'options'   => [
                PDO::ATTR_PERSISTENT => true,
            ],
        ],
    ],
];

不過官方也有說明,如果 driver 支援長連接(例如 ODBC)就用 ODBC 原生的方法做,因為這樣不僅能讓單一應用程式使用 Connection Pooling,也能以 Process 的方式共享 Connection Pooling

  1. ODBC Connection Pooling

前提是 ODBC 的 driver 跟 library 有支援,然後直接把 driver 改成 ODBC,然後用 PDO_ODBC 去連接資料庫,記得在 php.ini 中設定 pdo_odbc.connection_pooling=strict/relaxed/off

  1. freeTDS

這是在網路上看到的做法,它是利用 linux process 去管理 connection,不確定現在還能不能用

結論

最簡單的做法是直接在 config/database.php 中加入一個 options,不過如果同一台伺服器上有超多個 connection 需求(建置有多個服務的話)那記憶體或磁碟 IO 使用量會很可觀。

比較複雜但完善的解決方法是使用支援 Connection Pooling 的 ODBC Driver,好處是不僅只限連接 MySQL,也可以無痛擴充連接 MSSQl 或 Oracle SQL(除了 SQL 語法之外的無痛),壞處是建置成本比較高(需要花點時間摸索跟研究)

6年前 评论

看来第二种简单,谢谢。

6年前 评论

SMProxy

A MySQL database connection pool based on MySQL protocol and Swoole.

https://github.com/louislivi/SMProxy

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!