2014-01-20 62 views
0

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

哪种情况应PRA使用ctice?

回答

1

与方案2一起使用。方案1的问题是相同的HandleDB实例将被所有请求共享,并且可能导致线程安全问题。请记住,请求可以并行执行。标准是每个线程/请求都有一个连接。

大多数Web应用程序使用连接池(如C3P0或Apache DBCP)来避免必须为每个请求创建新连接。您在请求开始时从池中获得连接,并在请求结束时将其返回给池,以便其他请求稍后可以重用。

+0

是的,我们使用Apache DBCP连接池,我会为你的建议。 – ipkiss

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 
    } 
} 
0

,如果您有批量的任务,你应该创建仅在第一个任务开始的数据库连接的再整理你应该释放所有任务或免费数据库连接

为后您的案例场景1适用。

相关问题