我有一个我想要在多个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;   
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top