当前位置: 代码迷 >> Java Web开发 >> MVC架构中通常大家在哪里关闭数据库连接
  详细解决方案

MVC架构中通常大家在哪里关闭数据库连接

热度:35   发布时间:2016-04-13 22:15:31.0
MVC架构中一般大家在哪里关闭数据库连接?
不用各种框架,就是JSP+Servlet+Dao这样的模式

主要有两个问题
1.理论上Dao是负责数据库的,那么所有跟数据库的操作(包括关闭connection、statement、resultset)都应该在dao内部完成。但是有的时候在servlet中某一个操作要涉及到调用多个dao,那么就意味着相应的connection可能会被打开关闭多次,严重影响性能。那么是不是应该将其移到servlet中做呢?

2.关闭的时候,是不是关闭了connection,就会自动关闭statement和resultset,那就不必辛辛苦苦的全部关一遍。
------解决思路----------------------
就是集中管理。
也类似于一个工具类
------解决思路----------------------
理论上http请求到达打开session,http响应时关闭session最理想
------解决思路----------------------
不用框架的话,写一个类,封装起来,用的时候调用不就好了
------解决思路----------------------
一般都不关闭吧。项目中实际是需要使用连接池的,用完就归还连接池。所以一般都是使用完了就close(其实是归还连接池)
------解决思路----------------------
按照你这种情况,就用servlet作为业务处理类,可以将session绑定到http请求上,当处理这次请求时都是用的同一个sessino,然后dao层获取的session都获取绑定的session,servlet处理完之后可以直接关闭这个session了
------解决思路----------------------

写一个通用的BaseDaoUtil 工具类调用就好了

BaseDao
------解决思路----------------------
在数据库连接的工具类中写一个关闭connection,resultset,preparedstatement三个资源的方法,不为空就关闭,在dao中直接调用这个方法
------解决思路----------------------
参考 hibernate 的思路

借用 ThreadLocal ,写个连接管理类

public class ConnectionFactory {
private staitc final ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
public static Connection getCurrentThreadConnection(){
Connection conn = tl.get();
if(conn == null){
    conn = 创建新的连接,或从连接池中得到新连接
    tl.set(conn);
}
return conn;
}

public static void closeCurrentThreadConnection(){
    Connection conn = tl.get();
    if(conn != null){
        try{ conn.close(); } catch(Exception ex){}
        tl.set(null);
    }
}
}

思路是把数据库的连接放到 ThreadLocal 对象中,即是每个线程最多会有一个连接

servlet 的任何地方,想要用到连接时,直接调用此类的静态方法即可

当要关闭连接时,也直接调用它的关闭连接即可

因为每次访问的是当前线程所对应的连接

最后,在 servlet 中增加过滤器,在过滤方法中加上

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain fc) throws IOExceptionServletException {

try{
fc.doFilter(req, res);
}finally{
ConnectionFactory.closeCurrentThreadConnection()
}

}
  相关解决方案