不用各种框架,就是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 IOException, ServletException {
try{
fc.doFilter(req, res);
}finally{
ConnectionFactory.closeCurrentThreadConnection()
}
}