2015-05-30 14 views
5

Sto usando SLIM Framework con Laravel Eloquent ORM per le API REST. Recentemente ho affrontato un problema di too many connections.troppe connessioni usando eloquent orm e mysql

Durante l'URI di una richiesta, è necessario effettuare più chiamate e Set nel DB mySql. Questo apre le connessioni su ogni transazione DB che faccio. Voglio evitarlo. Al momento, il pool di connessione mysql ha 200 thread.

la mia API dovrebbe avere più di 1000 chiamate simultanee e con l'ambiente corrente, il 40% delle chiamate non riuscirà (testato utilizzando jMeter).

La mia idea è che per una chiamata API, la mia applicazione dovrebbe utilizzare solo un thread di connessione e aumentare il pool di connessioni MySql da qualche parte intorno a 1000 a 1500. è un approccio sbagliato?

Con Eloquent ORM, ho la mia connessione DB gestita da Capsule. Se devo effettuare la prima connessione utilizzando il metodo Singleton e per qualsiasi chiamata successiva nella richiesta API, è necessario utilizzare lo stesso thread?

Ecco il mio database di gestione di connessione:

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(); 

Qual è l'approccio migliore per uscire da questo problema?

UPDATE

sto cercando un altro approccio per effettuare una connessione persistente. Tuttavia, la connessione persistente non viene chiusa dopo che la chiamata è stata eseguita con il lavoro. Anche chiamare DB::Disconnect non aiuta.

<?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

provato ' DB :: disconnect(); 'alla fine? –

+0

e 'SET GLOBAL max_connections = ;'? –

+0

Dove dovrei metterlo esattamente ?? Potresti essere specifico sul nome dell'azione ...? –

risposta

1

È necessario utilizzare la stessa connessione di database per tutte le query. Il modo più semplice per farlo è quello di connettersi al database nel contenitore DI in quanto è possibile estrarlo nuovamente ogni volta che ne hai bisogno.

Utilizzando Slim 3, sembra qualcosa di simile:

$container = $app->getContainer(); 

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

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

    return $capsule; 
}; 

È ora possibile utilizzare in un percorso 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; 

}); 

Tutti i dettagli nella documentazione qui: http://www.slimframework.com/docs/cookbook/database-eloquent.html

Problemi correlati