2010-07-04 13 views
7

के साथ डीबी को एकाधिक कनेक्शन खोलने से कैसे बचें मैं 4 साल से अधिक के लिए एक प्रक्रियात्मक प्रोग्रामर रहा हूं और ओओपी में देखना शुरू करने का समय है। इसके साथ, मान लें कि मुझे अपनी कक्षा में दो तरीकों को कॉल करने की आवश्यकता है। प्रत्येक विधि को डीबी से कनेक्शन की आवश्यकता होती है ताकि डीबी के लिए दो यात्राएं हों, जो कई कनेक्शन भी खुलती हैं। क्या यह एप्लिकेशन परत (कन्स्ट्रक्टर?) में किसी प्रकार का कोड रखने से बचा जा सकता है या क्या डीबी पक्ष पर एक कनेक्शन पूल स्थापित किया जाना चाहिए? और सिर्फ kicks के लिए, मैं mysql का उपयोग नहीं कर रहा हूँ; मैं codeigniter के साथ mongodb का उपयोग कर रहा हूँ।ओओपी PHP

यहां तक ​​कि मेरे पास अभी तक क्या है, यह सुनिश्चित नहीं है कि इसका उपयोग करना आदर्श है या नहीं?

यहाँ है जहाँ मैं सेटअप मेरे डीबी सूचना यह है:

database_conn.php

class Database_Conn extends Model { 

    function _connect() { 
     $m = new Mongo("localhost:27017", array("persist"=>"x")); 
     $db = $m->selectDB("foo"); 
     return $db; 
    }  
}  

नमूना मॉडल फ़ाइल

class Home_model extends Model { 

    public function __construct() { 
     // Establish connection to "profiles" table 
     $this->db_conn = Database_Conn::_connect()->selectCollection("profiles"); 
    } 

    function getMyProfile($username) { 
     $data = $this->db_conn->findOne(array("username" => $username)); 
     return $data; 
    } 

    function getAll() { 
     $data = $this->db_conn->find(); 
     return $data; 
    } 
} 

उत्तर

6

आप का उपयोग करना चाहिए singleton pattern

संपादित करें: जिस तरह से आपने इसे किया है, कई बार _connect को कॉल करना संभव है, जिसका अर्थ है पुन: कनेक्ट करना।

सिंगलटन कार्यान्वयन आमतौर पर आपको कन्स्ट्रक्टर को निजी/संरक्षित बनाना होता है और एक getInstance विधि को परिभाषित करना होता है जो पहले कॉल पर कनेक्शन बनाता है और बाद में कॉल पर बनाए गए कनेक्शन को वापस करता है।

इस

मैं क्या कर सकता है:

class Database_Conn extends Model { 

    static protected $_instance; 

    protected $db = null; 

    final protected function __construct() { 
     $m = new Mongo("localhost:27017", array("persist"=>"x")); 
     $this->db = $m->selectDB("foo"); 
    } 

    static public function getInstance() { 
     if (!(self::$_instance instanceof self)) { 
      self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    public function getConnection() { 
     return $this->db; 
    } 

    final protected function __clone() { } 
} 

और फिर Database_Conn::getInstance()->getConnection() का उपयोग कनेक्शन वस्तु प्राप्त करने के लिए।

+0

मैंने सोचा कि यह उन ऐप्स के लिए खराब है जिन्हें अंततः स्केल करने की आवश्यकता है? – luckytaxi

+0

सिंगलटन एक ऑब्जेक्ट बनाने का एक तरीका है जो तुरंत एक बार तत्काल होता है। यह स्केलेबिलिटी कैसे कम कर सकता है? कृपया मुझे बताएं) –

+0

क्षमा करें, मैं कुछ और सोच रहा था (पूछो नहीं)। मैं समझता हूं कि आप क्या कह रहे हैं, मुझे लगता है कि मैं अब कर रहा हूं। ऊपर मेरे कोड पर एक नज़र डालें। धन्यवाद। – luckytaxi

6

आपको अपने डीबी कनेक्शन के लिए मैनेजर क्लास में देखना चाहिए। फिर आपके पास एक केंद्रीय स्थान हो सकता है जहां से आप कनेक्शन का अनुरोध करते हैं। यदि पहले से ही एक खुला कनेक्शन है तो प्रबंधक एक नया कनेक्शन लौटने की बजाय उसे वापस कर सकता है।

यह एक दृष्टिकोण होगा। इस तरह कुछ कार्यान्वित करने के तरीके के बारे में कई उदाहरण हैं। MySQL और mssql के लिए पहले से ही कुछ हैं। लेकिन आप निश्चित रूप से अपने डीबी के लिए विस्तार कर सकते हैं।

+0

यह लगता है कि kgb ने क्या दिखाया है, नहीं? – luckytaxi

+0

यह करता है। लेकिन अगर आप देखते हैं कि हमने पोस्ट किया है तो वे एक ही समय में सही हैं। हालांकि उन्होंने और अधिक शामिल करने के बाद भी एक संपादन किया। – spinon

+0

कोई समस्या नहीं, मुझे एहसास हुआ कि मैं यह सुनिश्चित करना चाहता था कि मैं अवधारणा को सही ढंग से समझ रहा हूं। एक बार फिर धन्यवाद! – luckytaxi

1

डेटाबेस परत का उपयोग करें। इस मामले में दीबी एक महान पुस्तकालय है। http://dibiphp.com

संबंधित मुद्दे