2009-12-16 21 views
9

Java Web hizmetinde oturum çekirdeği olarak uygulanan bir veritabanı bağlantısına ihtiyacım var ve bunu doğru yaptığından emin değilim. Bir bağlantı gerektiğindeJDBC Bağlantı Havuzunun (Glassfish) doğru kullanımı

ben

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

     } 
    } 
} 

kameranın bu şekilde kullanmak, yoksa DataSource fasulye üyesi olmalıdır Olur

yapmak bir sınıf

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();    
    } 
} 

yarattı?

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

Bu bir sorun soruysa özür dilerim, ancak Java için oldukça yeni. Şimdiden teşekkürler.

cevap

14

C stili biçimlendirme dışında, birkaç gereksiz satır ve biraz kötü durum dışı durum işleme, bunu yapabilirsiniz. İşte

yapardım nasıl:

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();    
    } 
} 

Burada atmak ExceptionInInitializerError uygulama hemen bir bağlantı elde etmek için çalışırken NullPointerException "açıklanamaz" yüz gerekmez böylece duracak şekilde yerleştirin.

+1

+1. – ewernli

+2

Bununla birlikte, çekirdeğin içindeki enjeksiyonu tercih ederim çünkü alay etmek ve test etmek daha kolaydır. – ewernli

+0

Cevabınız için çok teşekkürler. – a1ex07

10

Eski J2EE dünyasında, bunu yönetmenin geleneksel yolu bir ServiceLocator kullanmaktı.

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; 
    } 
} 

böyle diyoruz basitçe Kullanmak için: Aşağıda, örnek bir uygulama (non optimize DataSource önbelleğe alınabilir)

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

Ama bu EJB3 ve Bağımlılık Enjeksiyon öncesinde oldu dönemi.

: EJB3 kullanırken Şimdi, EJB kapta kurulum senin DataSource varsa, yapmanız gereken tüm otomatik Vatansız Bean'deki DataSource enjekte etmek (mydatabase veri kaynağı adıdır) yazmaktır

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

EJB3 aslında ServiceLocator desen gereksiz hale gelir ve onlarla çalışırken gerçekten enjeksiyonu tercih etmeliyiz: açıkça, iyi, adını ayarlamak istiyorsanız

@Resource 
private DataSource mydatabase; 
adı özniteliğini kullanın.

+2

Ah drat, ben * biliyordum. Bu aslında bazı yardım sınıflarından çok daha iyi **. +1. – BalusC

0

Um, bu bir JDBC DataSource bir örnek değil, bir GlassFish Bağlantı Havuzu? Bilmediğim ExceptionInInitializerError için

İlgili konular