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