2015-05-30 15 views
5

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 GetSet 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')); 
     } 
    }); 
+0

Cố gắng ' DB :: disconnect(); 'ở cuối? –

+0

và 'SET GLOBAL max_connections = ;'? –

+0

Tôi nên đặt cái này ở đâu? Bạn có thể cụ thể về tên hành động ...? –

Trả lời

1

Bạn nên sử dụng cùng một kết nối cơ sở dữ liệu cho tất cả các truy vấn. Cách dễ nhất để làm điều này là kết nối với cơ sở dữ liệu trong DI Container vì bạn chỉ có thể kéo nó ra lần nữa mỗi khi bạn cần nó.

Sử dụng Slim 3, nó trông giống như sau:

$container = $app->getContainer(); 

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

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

    return $capsule; 
}; 

Bây giờ bạn có thể sử dụng trong một tuyến đường callable:

$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; 

}); 

Chi tiết đầy đủ trong tài liệu ở đây: http://www.slimframework.com/docs/cookbook/database-eloquent.html

Các vấn đề liên quan