簡體   English   中英

在具有資源注入的多個servlet中使用數據源

[英]Using a DataSource in multiple servlets with resource injection

我有一個要在多個servlet中使用的javax.sql.DataSource 我不喜歡指定的想法:

@Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
private DataSource liveDataSource_;

在我看來,在每個servlet中,該框架都必須為每個servlet查找數據源,如果DataSource的名稱發生更改,則每個servlet也都必須更改。

我的想法是聲明一個Singleton EJB,然后可以在每個servlet中聲明它:

@Startup
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class DataSources {  
    @Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
    private DataSource liveDataSource_;

    public synchronized Connection getLiveConnection() throws SQLException {
        return liveDataSource_.getConnection();
    }
}

這是解決問題的合理方法嗎? 我覺得對於某些我認為將是普遍問題的事情來說,這有點費力。

總的來說,IMO沒關系。 但是請不要讓Bean返回連接,而是直接返回DataSource。 再次離開Bean上下文時,某些類似WebSphere的AppServer將自動關閉連接。

另一種解決方案是使用@Resource(name =“ myds”)代替查找。 如果所有Servlet都在一個Web應用程序中,則可以在web.xml中定義一個帶有res-ref-name myds的resource-ref,然后僅在該位置將其解析為真實的查找名稱。

我會說,僅由於這個原因而使用EJB可能會像您所寫的那樣過於繁瑣。

首先,大多數現代應用程序服務器將緩存該查找,因此它不會那么昂貴。

其次-您可以使用@Resource(name =“ myds”),正如Robert所說的,它將使用相同的資源引用,可以使用應用程序服務器的映射功能將其映射到JNDI名稱。

第三-您可以使用CDI擁有僅Web模塊的解決方案,如下所示:

創建包含您的DataSource定義的類,如下所示:

public class Datasources {

    @Produces @Resource(name="jdbc/yourRef", lookup="yourJNDI")
    DataSource myDataSource;
}

然后通過Inject使用它servlet:

public class MyServlet extends HttpServlet {
    @Inject 
    private DataSource myDs;   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM