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

How to use jndi datasource in dao?

我正在尝试使用 tomcat、jsp、servlet 和 log4j 来完成我的第一个 Web 项目。我有 TO 像:用户、主题、教员等,和 DAO 对象像:UserRepository、SubjectRepository、FacultyRepository 等。对于存储库,我有以下层次结构(不是所有放置的实体): AbstractRepositoryDataSource的初始化是这样的:

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() 方法。

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

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

这样做的优点(让 DataSource 成为 AbstractRepositor 的一部分但不是静态的)是您有一种获取 DataSource 的常用方法,并且可以在需要时通过 subclasses (这需要使 ds 受保护)。