2009-07-28 8 views
5

मैंने पर्ल फोर्क मैनेजर और डीबीआई के साथ प्रयास किया है। लेकिन मुझे त्रुटि मिली डीबीडी :: mysql :: st execute विफल: क्वेरी के दौरान MySQL सर्वर से कनेक्शन खो गया।मैं पर्ल में एक कांटेदार बच्चे से डेटाबेस से पूछताछ क्यों नहीं कर पा रहा हूं?

यहाँ नमूना कोड: मैं उच्च मूल्य के लिए कम के बीच क्वेरी करना चाहते हैं (मैं पूर्णांक 10k रिकॉर्ड spitted है)

use Parallel::ForkManager; 
my $pm = new Parallel::ForkManager(50); 
my $db = krish::DB->new or die $!; # its has all connection details 
while ($low < $high ) { 
    # Some value manipulation 

    my $pid = $pm->start and next; 
    #db_execution returns execution 
    while (my $sth = db_execution ($db, $low , $high)) { 
     ... 
     #fetch row operation 
     ... 
    } 
    $pm->finish; 
} 

sub db_execution { 
    ... 
    my $dbh = $db->connect('students') or die $!; 
    my $sth = $dbh->prepare($sql) or die "$!:" . $dbh->errstr; 
    $sth->execute or die "$!:" . $sth->errstr; 
    ... 
} 

एक ही कोड बाहर समानांतर प्रसंस्करण के साथ क्रियान्वित कर रहा है। मामला क्या है? यह कैसे हल करें?

+0

क्षमा करें हर कोई। मैंने गलती से समुदाय विकी – joe

उत्तर

9

जब आप प्रक्रियाओं के बीच डेटाबेस कनेक्शन साझा करते हैं (जो आप एक कांटा के साथ कर रहे हैं) तो आपको यह सुनिश्चित करने की आवश्यकता है कि एक प्रक्रिया इसे दूसरे के नीचे से बंद न करे। चूंकि कनेक्शन भी चर होते हैं, जब पर्ल दुभाषिया बंद हो जाता है तो वह उस ऑब्जेक्ट की DESTROY विधि को कॉल करेगा जो इस मामले में कनेक्शन बंद कर देगा।

तो यदि कोई भी बच्चा डीबी कनेक्शन बंद करता है (जो खत्म होने और बंद होने पर होता है) तो यह इसे मूल प्रक्रिया के तहत से मार देगा। इसे रोकने का तरीका InactiveDestroy को कांटे से पहले मूल प्रक्रिया में सत्य पर सेट करना है और फिर किए जाने पर माता-पिता में कनेक्शन को बंद करना है।

https://metacpan.org/pod/DBI#InactiveDestroy

+3

में परिवर्तित कर दिया है यह करने का एक और तरीका है कि आप 'फोर्क() 'के बाद डेटाबेस कनेक्शन खोलें। इस तरह प्रत्येक बच्चे का अपना कनेक्शन होता है और वे एक दूसरे के साथ हस्तक्षेप नहीं कर सकते हैं। एकाधिक प्रक्रियाओं के बीच एक कनेक्शन साझा करना आम तौर पर एक अच्छा विचार नहीं है। –

+1

हाँ, यह भी काम करता है। खासकर जब से कुछ सिस्टम (जैसे ओरेकल) प्रक्रियाओं के बीच साझाकरण कनेक्शन का समर्थन नहीं करते हैं। – mpeters

0

आप बच्चे प्रक्रियाओं के सभी में एक साथ एक ही डाटाबेस संभाल का उपयोग करके मुसीबत के लिए पूछ रहे हैं। आपको प्रत्येक बच्चे में एक नया कनेक्शन बनाना चाहिए।

कोई बात नहीं ... मैं बाकी कोड पढ़ता हूं।

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

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