在具有资源注入的多个servlet中使用DataSource
-
02-01-2020 - |
题
我有一个我想要在多个servlet中使用的javax.sql.DataSource
。我不喜欢指定的想法:
@Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
private DataSource liveDataSource_;
.
在每个servlet上,在我看来,框架必须要为每个servlet查找数据源,如果数据源的名称更改,则每个servlet都必须更改。
我的想法是声明一个单身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返回连接,但直接返回数据源。 当Bean上下文再次剩下时,某些类似WebSphere等AppServers将自动关闭连接。
另一个解决方案是使用@resource(name=“myds”)而不是查找。 如果所有Servlet都在一个Web应用程序中,那么您可以在Web.xml中使用Res-ref-name Myds定义一个资源-fer,并将其解析为此位置的真实查找名称。
其他提示
我会说只为这个原因使用EJB可能会在你写的情况下有点过于沉重。
首先大多数现代应用程序服务器都会缓存查找,因此它不会昂贵。
第二 - 您可以使用@resource(name=“myds”)作为robert表示它会使用相同的资源参考,可以使用应用程序服务器的映射函数映射到JNDI名称。
三 - 您可以使用CDI仅具有Web模块,如下所示:
创建包含这样的数据源定义的类:
public class Datasources {
@Produces @Resource(name="jdbc/yourRef", lookup="yourJNDI")
DataSource myDataSource;
}
.
然后使用IT Servlet使用注入:
public class MyServlet extends HttpServlet {
@Inject
private DataSource myDs;
. 不隶属于 StackOverflow