[英]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.