2011-12-26 5 views
6

बस Play पर शुरू करें। दस्तावेज इस बारे में बात करता है कि प्ले को असीमित रूप से कैसे चलाया जा सकता है।प्ले फ्रेमवर्क में async/non-blocking MySQL क्वेरी कैसे चलाएं?

लेकिन असीमित रूप से चलते समय MySQL क्वेरी कैसे चलाएं? सामान्य MySQL क्वेरी अवरुद्ध कर रहे हैं, है ना? तो यह काम नहीं करेगा।

नोड.जेएस के पास इस उद्देश्य के लिए अपने स्वयं के गैर-अवरुद्ध MySQL क्लाइंट हैं, लेकिन मुझे Play के लिए कुछ भी नहीं मिल रहा है।

आप एक एसिंक्रोनस प्ले एप्लिकेशन के भीतर MySQL क्वेरी कैसे चलाते हैं?

उत्तर

3

प्ले फ्रेमवर्क में इस लिंक Asynchronous jobs पर देखें।

+1

धन्यवाद। मुझे यकीन नहीं है कि मैं समझता हूं कि नौकरियां कैसे अवरुद्ध हो सकती हैं। अगर मेरा MySQL क्लाइंट अवरुद्ध हो रहा है, तो इसे नौकरी के भीतर उपयोग करना अभी भी अवरुद्ध होगा, नहीं? या हर बार जब कोई नया काम बनाया जाता है तो क्या एक नया धागा फैलता है? उस स्थिति में यह एक एसिंक फ्रेमवर्क के पूरे उद्देश्य को हरा देता है। – Continuation

+2

@ संयोजक मुझे लगता है कि आप "एसिंक्रोनस फ्रेमवर्क" को भ्रमित कर सकते हैं "प्ले के संबंध में" अतुल्यकालिक संचालन में सक्षम ढांचे "के साथ! ढांचा? जैसा कि लिंक किए गए दस्तावेज बताते हैं, आप HTTP अनुरोध से असीमित रूप से लंबे समय से चलने वाले संचालन करने और अन्य आने वाले HTTP अनुरोधों को गैर-अवरुद्ध करने के लिए नौकरियों का उपयोग कर सकते हैं। – tmbrggmn

2

Play नौकरियां एक अलग थ्रेड में निष्पादित की जाती हैं और मुख्य http थ्रेड जारी करती हैं। मुख्य http थ्रेड तब शुरू किया जाता है जब नौकरी (वादा ऑब्जेक्ट में लपेटा जाता है) पूरा होने के बाद लौटाता है।

तो, मुख्य http थ्रेड नहीं रखा गया है, और अन्य आने वाले http अनुरोधों को संभालने के लिए उपलब्ध कराया जा सकता है।

0

डीबी को एसक्यूएल कॉल के सामान्य निष्पादन में आम तौर पर अवरुद्ध और निष्पादित किया जाता है। एसिंक्रोनस निष्पादन के लिए Play का बहुत अच्छा समर्थन है जो आपके ऐप के प्रदर्शन को बेहतर बनाता है।

कार्य कोड नमूने के लिए खेलते हैं 2,0

public static Result slow() { 
    Logger.debug("slow started"); 

    // Start execution 
    Promise<DataObject> userObject1 = SlowQuery.getUser(440); 
    Promise<DataObject> userObject2 = SlowQuery.getCategory(420); 
    // ... here execution is already in progress ... 

    // Map to Promise Objects 
    Promise<DataObject> res1 = userObject1.map(new Function<DataObject, DataObject>() { 
     public DataObject apply(DataObject res) { 
      Logger.debug("Got result (userObject1): " + res.toString()); 
      return res; 
     } 
    }); 

    Promise<DataObject> res2 = userObject2.map(new Function<DataObject, DataObject>() { 
     public DataObject apply(DataObject res) { 
      Logger.debug("Got result (userObject2): " + res.toString()); 
      return res; 
     } 
    }); 

    // here we wait for completion - this blocks 
    userObject1.getWrappedPromise().await(); 
    userObject2.getWrappedPromise().await(); 

    // the result is available 
    Logger.debug(res1.get().toString()); 
    Logger.debug(res2.get().toString()); 

    Logger.debug("slow finished"); 
    return ok("done"); 
} 

समुदाय विकी सुविधा का उपयोग कर सुधार करने के लिए स्वतंत्र लग रहा है - मुझे यकीन है कि कुछ भागों छोटा किया जा सकता हूँ।

+7

लेकिन जब तक डेटाबेस क्लाइंट स्वयं अवरुद्ध हो रहा है तब तक Play थ्रेड भी अवरुद्ध हो जाएगा, नहीं? Node.js एक गैर-अवरुद्ध MySQL क्लाइंट प्रदान करता है जिससे समस्या हल हो जाती है। लेकिन मुझे नहीं लगता कि प्ले किसी भी गैर-अवरुद्ध डीबी क्लाइंट की पेशकश करता है। क्या आप समझा सकते हैं कि आपका कोड डीबी कॉल को गैर-अवरुद्ध करने में कैसे बदलता है? – Continuation

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