2015-05-30 14 views
5

का उपयोग करके बहुत से कनेक्शन मैं REST API के लिए Laravel के Eloquent ORM के साथ SLIM Framework का उपयोग कर रहा हूं। हाल ही में मुझे too many connections की समस्या का सामना करना पड़ा।eloquent orm और mysql

एक अनुरोध के दौरान यूआरआई, मुझे कई Get और Set को MySQL डीबी में कॉल करने की आवश्यकता है। यह मेरे द्वारा किए गए प्रत्येक डीबी लेनदेन पर कनेक्शन खोलता है। मैं इससे बचना चाहता हूं। अभी, MySQL कनेक्शन पूल में 200 धागे हैं।

मेरी एपीआई 1000 से अधिक समवर्ती कॉल होने की उम्मीद है और वर्तमान वातावरण के साथ, 40% कॉल विफल हो जाएंगे (जेएमटर का उपयोग करके परीक्षण किया जाएगा)।

मेरा विचार यह है कि एक एपीआई कॉल के लिए, मेरे आवेदन को केवल एक कनेक्शन थ्रेड का उपयोग करना चाहिए और माइस्क्ल कनेक्शन पूल को लगभग 1000 से 1500 तक बढ़ा देना चाहिए। क्या यह एक बुरा दृष्टिकोण है?

बोलने वाले ओआरएम के साथ, मेरे पास डीपीएस कनेक्शन कैप्सूल द्वारा प्रबंधित किया जा रहा है। क्या मुझे Singleton विधि का उपयोग करके पहला कनेक्शन बनाना चाहिए और एपीआई अनुरोध में किसी भी कॉल के लिए, उसी धागे का उपयोग किया जाना चाहिए?

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

की कोशिश की ': प्रलेखन यहाँ

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

पूर्ण विवरण:

$container = $app->getContainer(); $container['db'] = function ($container) { $capsule = new \Illuminate\Database\Capsule\Manager; $capsule->addConnection($container['settings']['db']); $capsule->setAsGlobal(); $capsule->bootEloquent(); return $capsule; }; 

अब आप एक मार्ग प्रतिदेय में उपयोग कर सकते हैं:

स्लिम 3 का उपयोग करना, यह इस तरह दिखता है डीबी :: डिस्कनेक्ट(); अंत में? –

+0

और 'सेट ग्लोबल max_connections = ;'? –

+0

मुझे यह कहां रखना चाहिए ?? क्या आप एक्शन नाम के बारे में विशिष्ट हो सकते हैं ...? –

उत्तर

1

आपको सभी प्रश्नों के लिए एक ही डेटाबेस कनेक्शन का उपयोग करना चाहिए। ऐसा करने का सबसे आसान तरीका DI कंटेनर में डेटाबेस से कनेक्ट करना है क्योंकि आप इसे हर बार फिर से खींच सकते हैं। http://www.slimframework.com/docs/cookbook/database-eloquent.html