我正在尝试使用tomcat,jsp,servlets和log4j完成我的第一个web项目。我有TO
喜欢:User,Subject,Faculty等,以及DAO
对象,如:UserRepository,SubjectRepository,FacultyRepository等。对于存储库,我有以下层次结构(并非所有实体都放置):
DataSource
中AbstractRepository
的初始化就是这样:
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
文件了解它应该保留多少个连接?我刚刚感到困惑。你能解释一下最佳实践吗?也许我应该重新设计一些东西?
答案 0 :(得分:1)
我之前遇到过很多次。我会有一个名为CommonDao的类,它与您的AbstractRepository类似。 Connection或DataSource是一个属于CommonDao的变量,但它不是静态的......所以CommonDao的每个实例都有自己的副本。所以我的答案是,只要你不将AbstractRepository.ds设为静态,那么你应该没问题。
执行此操作的优点(使DataSource成为AbstractRepositor的一部分但不是静态的)是您有一种获取DataSource的常用方法,并且如果需要子类可以覆盖它(这需要使ds受保护)。