如何在dao中使用jndi数据源?

时间:2015-01-17 16:47:07

标签: java tomcat servlets jndi dao

我正在尝试使用tomcat,jsp,servlets和log4j完成我的第一个web项目。我有TO喜欢:User,Subject,Faculty等,以及DAO对象,如:UserRepository,SubjectRepository,FacultyRepository等。对于存储库,我有以下层次结构(并非所有实体都放置): repository hierarchy DataSourceAbstractRepository的初始化就是这样:

public abstract class AbstractRepository<T> implements Repository<T> {

private final static Logger LOG = Logger
        .getLogger(AbstractRepository.class);
private static final DataSource ds = init();

private static  DataSource init() {
    DataSource dataSource = null;
    try {
        Context initContext = new InitialContext();
        dataSource = (DataSource) initContext
                .lookup("java:/comp/env/jdbc/mydb");
    } catch (NamingException ex) {
        LOG.error("Cannot obtain a connection from the pool", ex);
    }
    return dataSource;
}
protected Connection getConnection() throws SQLException {
    return ds.getConnection();
}
....
}

现在,如果存储库需要Connection,则只需调用父getConnection()方法。

问题是在DataSource中有一个AbstractRepository对象,并且每个子类存储库将使用parent中的方法获取Connection,或者每个子类应该有自己的private final DataSource将在构造函数中初始化的字段?然后解释一下:如果我选择第一种方式,我应该使用方法getConnection synchronized关键字?如果我选择第二种方式:那么子类存储库应该是单例,因为每次请求来到一个servlet时它会创建一个存储库,因此它将是多个DataSources?或者Tomcat通过context.xml文件了解它应该保留多少个连接?我刚刚感到困惑。你能解释一下最佳实践吗?也许我应该重新设计一些东西?

1 个答案:

答案 0 :(得分:1)

我之前遇到过很多次。我会有一个名为CommonDao的类,它与您的AbstractRepository类似。 Connection或DataSource是一个属于CommonDao的变量,但它不是静态的......所以CommonDao的每个实例都有自己的副本。所以我的答案是,只要你不将AbstractRepository.ds设为静态,那么你应该没问题。

执行此操作的优点(使DataSource成为AbstractRepositor的一部分但不是静态的)是您有一种获取DataSource的常用方法,并且如果需要子类可以覆盖它(这需要使ds受保护)。