gpt4 book ai didi

php - 使用 Eloquent orm 和 mysql 的连接太多

转载 作者:可可西里 更新时间:2023-11-01 06:38:30 27 4
gpt4 key购买 nike

我将 SLIM Framework 与 Laravel 的 Eloquent ORM 一起用于 REST API。最近我遇到了太多连接的问题。

在一个请求 URI 期间,我需要对 mySql DB 进行多次 GetSet 调用。这会打开我进行的每个数据库事务的连接。我想避免这种情况。目前mysql连接池有200个线程。

我的 API 预计有超过 1000 个并发调用,在当前环境下,40% 的调用将失败(使用 jMeter 测试)。

我的想法是,对于一个 API 调用,我的应用程序应该只使用一个连接线程并将 MySql 连接池增加到大约 1000 到 1500 的某个位置。 这是一个糟糕的方法吗?

使用 Eloquent ORM,我的数据库连接由 Capsule 管理。我应该使用 Singleton 方法建立第一个连接,并且对于 API 请求中的任何后续调用,应该使用相同的线程吗?

这是我的数据库连接管理器:

    use Illuminate\Database\Capsule\Manager as Capsule;
/**
* Configure the database and boot Eloquent
*/
$capsule = new Capsule;

$capsule->addConnection($databaseConfig['mysql']);

// Set the event dispatcher used by Eloquent models... (optional)
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;

$dispatcher = new Dispatcher(new Container);
$capsule->setEventDispatcher($dispatcher);

$capsule->setAsGlobal();
$capsule->bootEloquent();

解决这个问题的最佳方法是什么?

更新

我正在尝试另一种建立持久连接的方法。但是在完成工作后,持久连接仍然没有关闭。即使调用 DB::Disconnect 也无济于事。

    <?php

use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;

/**
* Configure the database and boot Eloquent
*/
$app->hook('slim.before', function() use ($app) {
try {

// pr('', $app->settings['databaseConfig']['mysql'], 1);
/*
* Register Eloquent as singleton to slim container
* since we will use the same instance across the request cycle
*/
$app->container->singleton('db', function() {
return new Capsule;
});

$app->db->addConnection($app->settings['databaseConfig']['mysql']);

$dispatcher = new Dispatcher(new Container);
$app->db->setEventDispatcher($dispatcher);

if (isset($app->settings['databaseConfig']['profiler']) && $app->settings['databaseConfig']['profiler']) {
$dispatcher->listen('illuminate.query', function($sql, $params, $time, $conn) {

dd(array($sql, $params, $time, $conn));
});
}

$app->db->setAsGlobal();
$app->db->bootEloquent();
} catch (PDOException $e) {
/** Do some stuff to handle exception */
echoResponse(501, array('No DB Connections'));
}
});

最佳答案

您应该对所有查询使用相同的数据库连接。最简单的方法是连接到 DI 容器中的数据库,因为您可以在每次需要时再次将其拉出。

使用 Slim 3,它看起来像这样:

$container = $app->getContainer();

$container['db'] = function ($container) {
$capsule = new \Illuminate\Database\Capsule\Manager;
$capsule->addConnection($container['settings']['db']);

$capsule->setAsGlobal();
$capsule->bootEloquent();

return $capsule;
};

您现在可以在可调用路由中使用:

$app->get('/list', function ($request, $response) {
$table = $this->get('db')->table('table_name');
$data = $table->get();

// do something with data
$response->write(print_r($data, true));

return $response;

});

此处文档中的完整详细信息:http://www.slimframework.com/docs/cookbook/database-eloquent.html

关于php - 使用 Eloquent orm 和 mysql 的连接太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30543789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com