2010-05-01 11 views
9

में @ सिंगलेटन का उपयोग कब करें मेरे पास एक जर्सी संसाधन है जो डेटाबेस तक पहुंचता है। असल में यह संसाधन के प्रारंभ में डेटाबेस कनेक्शन खोलता है। संसाधन के तरीकों पर प्रश्न पूछता है।जर्सी संसाधन

मैंने देखा है कि जब मैं @ सिंगलेटन का उपयोग नहीं करता, तो डेटाबेस प्रत्येक अनुरोध पर खुला रहता है। और हम जानते हैं कि एक कनेक्शन खोलना वास्तव में महंगा है?

तो मेरा सवाल यह है कि, क्या मुझे यह निर्दिष्ट करना चाहिए कि संसाधन सिंगलटन हो या क्या यह प्रति अनुरोध पर रखना बेहतर होगा, खासकर जब संसाधन डेटाबेस से कनेक्ट हो रहा हो?

मेरे संसाधन कोड इस तरह दिखता है:

//Use @Singleton here or not? 
@Path(/myservice/) 
public class MyResource { 

    private ResponseGenerator responser; 
    private Log logger = LogFactory.getLog(MyResource.class); 

    public MyResource() { 
     responser = new ResponseGenerator(); 
    } 

    @GET 
    @Path("/clients") 
    public String getClients() { 

     logger.info("GETTING LIST OF CLIENTS"); 

     return responser.returnClients(); 
    } 

    ... 
    // some more methods 
    ... 

} 

और मैं एक कोड इस के समान का उपयोग कर डेटाबेस से कनेक्ट:

public class ResponseGenerator { 
    private Connection conn; 
    private PreparedStatement prepStmt; 
    private ResultSet rs; 

    public ResponseGenerator(){ 
     Class.forName("org.h2.Driver"); 
     conn = DriverManager.getConnection("jdbc:h2:testdb"); 
    } 

    public String returnClients(){ 
     String result; 
     try{ 
      prepStmt = conn.prepareStatement("SELECT * FROM hosts"); 

      rs = prepStmt.executeQuery(); 

      ... 
      //do some processing here 
      ... 
     } catch (SQLException se){ 
      logger.warn("Some message"); 
     } finally { 
      rs.close(); 
      prepStmt.close(); 
      // should I also close the connection here (in every method) if I stick to per request 
      // and add getting of connection at the start of every method 
      // conn.close(); 
     } 

     return result 
    } 

    ... 
    // some more methods 
    ... 

} 

कोड के लिए सर्वोत्तम प्रथाओं पर कुछ टिप्पणियां भी सहायक होगा ।

+0

कनेक्शन पूलिंग के बारे में कैसे? आप इसका उपयोग क्यों नहीं करते? –

उत्तर

-4

आप सबसे अच्छा विकल्प स्प्रिंग विद जर्सी जैसे ढांचे का उपयोग करना है जिसे मैंने इसी तरह के post में उल्लिखित किया है। केवल अंतर यह है कि एक सेवा बीन इंजेक्शन देने के बजाय आप एक पूल किए गए डेटासोर्स को इंजेक्ट करेंगे और इसे आसानी से c3p0 का उपयोग करके कॉन्फ़िगर किया जा सकता है।

उदाहरण अनुप्रयोगकॉन्टेक्स्ट.एक्सएमएल, ध्यान दें कि "स्कोप" प्रोटोटाइप पर सेट है जो स्प्रिंग पैरालांस में सिंगलटन के बराबर है।

<bean id="pooledDataSource" scope="prototype" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="jdbcUrl" value="${jpa.url}" /> 
    <property name="user" value="${jpa.username}" /> 
    <property name="password" value="${jpa.password}" /> 
    <property name="initialPoolSize" value="1" /> 
    <property name="minPoolSize" value="1" /> 
    <property name="maxPoolSize" value="3" /> 
    <property name="idleConnectionTestPeriod" value="500" /> 
    <property name="acquireIncrement" value="1" /> 
    <property name="maxStatements" value="50" /> 
    <property name="numHelperThreads" value="1" /> 
</bean> 

अपने MyResource.java में आप बस निम्नलिखित जोड़ देंगे और वसंत उचित रूप से इंजेक्ट करेगा।

private DataSource pooledDataSource; 
public void setPooledDataSource(DataSource pooledDataSource) { 
    this.pooledDataSource = pooledDataSource; 
} 

फिर आप डेटासोर्स को स्वीकार करने के लिए अपने प्रतिक्रिया जनरेटर को बदल सकते हैं और डेटाबेस से पूछताछ के लिए इसका उपयोग कर सकते हैं।

0

संसाधन को सिंगलटन बनाने के बारे में सोचने के बजाय, बैकएंड के प्रबंधन पर अधिक ध्यान केंद्रित करें, सेवा प्रकार ऑब्जेक्ट्स जैसे ResponseGenerator कक्षा सिंगलेट के रूप में, जो स्पष्ट रूप से प्रत्येक अनुरोध को तत्काल नहीं किया जाना चाहिए।

संसाधन के रूप में अच्छी तरह से एक सिंगलटन बनाना एक सिंगलटन के रूप में ResponseGenerator प्रबंध का एक तरीका है, लेकिन यह केवल या जरूरी सबसे अच्छा तरीका नहीं है, Access external objects in Jersey Resource class और How to wire in a collaborator into a Jersey resource? देखने के तरीके गैर सिंगलटन संसाधनों में इस सुई के लिए।

ध्यान दें कि आपके ResponseGenerator कक्षा को सिंगलटन के रूप में कार्य करने से पहले काम की आवश्यकता होगी, चाहे प्रति-अनुरोध संसाधन में इंजेक्शन दिया गया हो या एकल कोड संसाधन में तत्काल हो। यह थ्रेड सुरक्षित नहीं है, और आप स्टार्टअप पर एक कनेक्शन खोलेंगे और अनुरोधों पर इसका पुन: उपयोग करेंगे, जो काम नहीं करेगा, आपको कनेक्शन अनुरोधों का कुशल भारोत्तोलन करने के लिए कनेक्शन कनेक्शन का उपयोग करना चाहिए या अनुरोधों पर सुरक्षित रूप से कनेक्शन का पुन: उपयोग करना चाहिए।

कोड के लिए सर्वोत्तम प्रथाओं पर कुछ टिप्पणियां भी सहायक होंगी।(एक प्रतिक्रिया जनरेटर बस एक वेब अनुप्रयोग में सब कुछ के बारे में है)

  • ResponseGenerator एक वर्ग के लिए एक गरीब नाम है:

आप http://codereview.stackexchange.com, लेकिन पर बेहतर प्रतिक्रियाएं मिल जाएगा।

  • अपनी सेवा और वस्तु के रिटर्न प्रकार के रूप में स्ट्रिंग का उपयोग न करें, उचित टाइप की गई वस्तुओं का उपयोग करें (उदाहरण के लिए ऐसा लगता है जैसे आप java.util.List कुछ वापस कर रहे हैं)।

  • अपने एसक्यूलेक्सप्शन को निगलें, जर्सी को अपने संसाधन में 5xx श्रृंखला प्रतिक्रिया कोड उत्पन्न करने की अनुमति देने के लिए इसे बबल करें।

  • अंतिम सदस्य चर का उपयोग करें।

  • आपकी लॉग ऑब्जेक्ट स्थिर होना चाहिए।

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