繁体   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