如何在dao中使用jndi数据源?
How to use jndi datasource in dao?
我正在尝试使用 tomcat、jsp、servlet 和 log4j 来完成我的第一个 Web 项目。我有 TO
像:用户、主题、教员等,和 DAO
对象像:UserRepository、SubjectRepository、FacultyRepository 等。对于存储库,我有以下层次结构(不是所有放置的实体):
AbstractRepository
中DataSource
的初始化是这样的:
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 受保护)。
我正在尝试使用 tomcat、jsp、servlet 和 log4j 来完成我的第一个 Web 项目。我有 TO
像:用户、主题、教员等,和 DAO
对象像:UserRepository、SubjectRepository、FacultyRepository 等。对于存储库,我有以下层次结构(不是所有放置的实体):
AbstractRepository
中DataSource
的初始化是这样的:
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 受保护)。