Tôi đang sử dụng SLIM Framework
với Laravel's Eloquent ORM
cho API REST. Gần đây, tôi gặp phải sự cố too many connections
.quá nhiều kết nối bằng cách sử dụng eloquent orm và mysql
Trong một URI yêu cầu, tôi cần thực hiện một số yêu cầu Get
và Set
cuộc gọi đến mySql DB. Điều này mở ra các kết nối trên mọi giao dịch DB mà tôi thực hiện. Tôi muốn tránh điều đó. Ngay bây giờ, hồ bơi kết nối mysql có 200 luồng.
API của tôi dự kiến sẽ có hơn 1000 cuộc gọi đồng thời và với môi trường hiện tại, 40% cuộc gọi sẽ không thành công (được thử bằng cách sử dụng jMeter).
Ý tưởng của tôi là đối với một cuộc gọi API, ứng dụng của tôi chỉ nên sử dụng một chuỗi kết nối và tăng nhóm kết nối MySql lên khoảng 1000 đến 1500. đây có phải là phương pháp không tốt?
Với ORM trung bình, tôi có kết nối DB được quản lý bởi Capsule. Tôi có nên thực hiện kết nối đầu tiên bằng phương pháp Singleton
và cho bất kỳ lệnh gọi tiếp theo nào trong yêu cầu API hay không, nên sử dụng cùng một chuỗi?
Đây là quản lý kết nối cơ sở dữ liệu của tôi:
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();
phương pháp tốt nhất để thoát khỏi vấn đề này là gì?
CẬP NHẬT
Tôi đang cố gắng tiếp cận khác để thực hiện một kết nối liên tục. Nhưng vẫn kết nối liên tục không bị đóng sau khi cuộc gọi được thực hiện với công việc. Ngay cả gọi DB::Disconnect
cũng không giúp ích gì.
<?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'));
}
});
Cố gắng ' DB :: disconnect(); 'ở cuối? –
và 'SET GLOBAL max_connections =;'? –
Tôi nên đặt cái này ở đâu? Bạn có thể cụ thể về tên hành động ...? –