是否应为每个请求创建新实例?

时间:2014-01-20 03:45:28

标签: database servlets web

我正在使用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;

在实践中应该使用哪种方案?

3 个答案:

答案 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适用。