【发布时间】:2014-03-16 15:42:05
【问题描述】:
我有一些现有的 java 代码,以一些 DAO 类的形式,例如
class EmployeeDao {
public EmployeeDao(Connection conn) {
// Prepare statements to be used by the methods below
}
public Employee getEmployeeById(long id) {
}
public Collection<Employee> getEmployeesByDepartment(long departmentId) {
}
...
}
所有 DAO 类都是使用 JDBC 连接构建的。构造器准备方法所需的任何语句。这在单线程环境(例如批处理)中运行良好,调用者可以创建连接并使用该连接实例化所需的 Dao 对象。
我希望能够在 Java Web 应用程序中使用它,但我只是不确定如何处理 JDBC 连接。以下是一些想法:
每个请求都会创建一个新的 JDBC 连接并实例化所需的 Dao 对象。连接创建和 Dao 实例化显然都很昂贵
每个请求都从 JNDI 数据源获取连接并实例化所需的 Dao 对象。这消除了连接创建的开销,但保留了准备所有语句的开销
每个请求都从 JDNI 数据源获取连接并实例化所需的 Dao 对象,但语句不再由构造函数准备,它们是根据需要延迟准备的。
HttpSessionListener 实例化 Dao 对象并将它们存储在会话中(使用 setAttribute)。当会话到期时,连接关闭。
创建无状态会话 bean。 bean 将实例化所需的 Dao 对象。
选项 1 不是真正的竞争者,它只是展示我的思考过程。
选项 2 和 3 可行,但似乎不是最佳选择,必须为每个请求准备语句似乎是一种开销,应该很容易避免,但我认为我错过了如何
选项 4 避免了在每次调用时准备语句的开销,但以手动维护状态为代价。我认为这不是 Servlet/JSP 应用程序中的预期使用模式(长时间保持连接)。
选项 5 应该可以工作,但似乎开销很大,这意味着我需要一个完整的 EJB 容器而不是一个简单的 servlet 引擎。
考虑到以下目标,哪些方法对人们有效:
- 尽可能避免为每个请求准备声明
- 最好使用简单的 servlet 引擎
PS:我知道 Hibernate 和 Entity Beans 等框架可以将其中的一些抽象出来,但我想理解“无框架”的基本情况。
【问题讨论】: