2009-12-16 13 views
9

का उचित उपयोग मुझे सत्र वेब बीन के रूप में लागू जावा वेब सेवा में डेटाबेस कनेक्शन की आवश्यकता है, और मुझे यकीन नहीं है कि मैं इसे सही करता हूं या नहीं।जेडीबीसी कनेक्शन पूल (ग्लासफ़िश)

मैं एक वर्ग

public final class SQLUtils { 
    //..... 
    private static DataSource m_ds=null;  

    static 
    { 
     try 
     { 
      InitialContext ic = new InitialContext(); 
      m_ds = (DataSource) ic.lookup(dbName); //Connection pool and jdbc resource previously created in Glassfish , dbName contains the proper JNDI resource name 

     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      m_ds = null; 
     } 

    } 

    public static Connection getSQLConnection() throws SQLException 
    { 
     return m_ds.getConnection();    
    } 
} 

बनाया जब भी मैं एक कनेक्शन की आवश्यकता मैं

कर
Connection cn = null; 
try 
{ 
    cn = SQLUtils.getSQLConnection(); 
    // use connection 
} 
finally 
{ 
    if (null != cn) 
    { 
     try 
     { 
      cn.close(); 
     } 
     catch (SQLException e) 
     { 

     } 
    } 
} 

यह यह इस तरह से उपयोग करने के लिए, या मैं डेटास्रोत फलियों का एक सदस्य होना आवश्यक है ठीक है?

@Stateless 
    @WebService 
    public class TestBean { 
    private @Resource(name=dbName) DataSource m_ds; 
    } 

मैं माफी चाहता हूँ अगर यह एक nube सवाल है, लेकिन मैं बहुत जावा के लिए नया हूँ। अग्रिम में धन्यवाद।

उत्तर

14

सी-शैली स्वरूपण के अलावा, कुछ अनावश्यक रेखाएं और थोड़ा खराब अपवाद हैंडलिंग, आप बस ऐसा कर सकते हैं।

यहाँ कैसे मैं यह कर करेंगे:

public final class SQLUtil { 
    private static DataSource dataSource; 
    // .. 

    static { 
     try { 
      dataSource = (DataSource) new InitialContext().lookup(name); 
     } catch (NamingException e) { 
      throw new ExceptionInInitializerError(e); 
     } 
    } 

    public static Connection getConnection() throws SQLException { 
     return dataSource.getConnection();    
    } 
} 

मैं यहाँ फेंक ExceptionInInitializerError ताकि आवेदन तुरंत तो बंद हो जाएगा कि आप सामना करने के लिए "unexplainable" NullPointerException जब एक कनेक्शन प्राप्त करने के लिए कोशिश कर रहा है की जरूरत नहीं है।

+1

ExceptionInInitializerError के लिए +1 जो मुझे नहीं पता था। – ewernli

+2

हालांकि मैं बीन में इंजेक्शन का पक्ष लेता हूं क्योंकि यह नकली और परीक्षण करना आसान है। – ewernli

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। – a1ex07

10

प्राचीन जे 2 ईई दुनिया में, इसका प्रबंधन करने का पारंपरिक तरीका ServiceLocator का उपयोग करना था। नीचे, एक नमूना कार्यान्वयन (गैर अनुकूलित किया है, DataSource कैश्ड किया जा सकता है):

public class ServiceLocator { 
    private Context initalContext; 

    private static ServiceLocator ourInstance = new ServiceLocator(); 

    public static ServiceLocator getInstance() { 
     return ourInstance; 
    } 

    private ServiceLocator() { 
     try { 
      this.initalContext = new InitialContext(); 
     } catch (NamingException ex) { 
      throw new ServiceLocatorException(...); 
     } 
    } 

    public DataSource getDataSource(String dataSourceName) { 
     DataSource datasource = null; 

     try { 
      Context ctx = (Context) initalContext.lookup("java:comp/env"); 
      datasource = (DataSource) ctx.lookup(dataSourceName); 
     } catch (NamingException ex) { 
      throw new ServiceLocatorException(...); 
     } 

     return datasource; 
    } 
} 

इसका इस्तेमाल के लिए, बस इसे इस तरह कहते हैं:

DataSource ds = ServiceLocator.getInstance().getDataSource("jdbc/mydatabase"); 

लेकिन इस EJB3 और निर्भरता इंजेक्शन से पहले थी युग।

: अब, जब, EJB3 का उपयोग कर यदि आप अपने सेटअप DataSource अपने EJB कंटेनर में है, तुम सब करने की है स्वचालित रूप से DataSource अपने स्टेटलेस बीन में सुई (जहां mydatabase डेटा स्रोत का नाम है) लिखना है
@Resource 
private DataSource mydatabase; 

नाम विशेषता का उपयोग करें यदि आप चाहते हैं करने के लिए स्पष्ट रूप से, ठीक है, नाम सेट:

@Resource(name="jdbc/mydatabase") 
private DataSource dataSource; 

EJB3 वास्तव में ServiceLocator पैटर्न अप्रचलित बनाने के लिए और जब उनके साथ काम तुम सच में इंजेक्शन को प्राथमिकता देनी चाहिए।

+2

आह ड्रैट, मैं * जानता था * यह। यह वास्तव में कुछ सहायक वर्ग की तुलना में ** ** ** बेहतर है। +1। – BalusC

0

उम, यह एक JDBC डेटा स्रोत के लिए एक उदाहरण नहीं है, न कि एक Glassfish कनेक्शन पूल?

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