我正在使用java servlet / jsp构建。我有一个类来处理数据库连接,但我不知道我应该为每个请求创建每个实例,还是为所有请求创建一个实例。 例如:
场景1 :
class HandleDB {
public static HandleDB getInstance(); // singleton pattern
public void initConnection();
public void releaseConnection();
}
然后,
//at the beginning of a request:
HandleDB.getInstance().initConnection();
// handle tasks
// at the end of request
HandleDB.getInstance().releaseConnection();
场景2 :
class HandleDB {
public void initConnection();
public void releaseConnection();
}
//at the beginning of a request:
HandleDB db = new HandleDB();
db.initConnection();
// handle tasks
// at the end of request
db.releaseConnection();
db = null;
在实践中应该使用哪种方案?
答案 0 :(得分:1)
使用场景2.场景1的问题是所有请求都将共享相同的HandleDB
实例,并可能导致线程安全问题。请记住,请求可以并行执行。标准是每个线程/请求有一个连接。
大多数Web应用程序使用连接池(如C3P0或Apache DBCP)来避免为每个请求创建新连接。您在请求开始时从池中获得连接,并在请求结束时将其返回到池中,以便其他请求可以在以后重用它。
答案 1 :(得分:0)
使用听众LINK
public class AppServletContextListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
/// Destroy DB Connection
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
/// Create DB Connection
}
}
答案 2 :(得分:0)
如果你有一批任务,你应该只在第一个任务开始时创建数据库连接,然后在完成所有任务后你应该释放或释放数据库连接
适用于您的案例场景1适用。