不知道算不算很常见的业界做法,这次有个项目是在页面载入完成后会首先去后台获取几个值,大约两三个ajax同时走,数据源是sqlserver,在另一台服务器上。
然后就刷新页面时不时的报连接已关闭,语句已关闭,空指针之类的问题
(spring)controller类大概是这样写的:
public class Controller{
private BaseDao dao=new BaseDao();
...
}
一开始是觉得每个请求进去都会单实例化一个新的controller,所以这么写,当一个请求有多次与数据库交换数据的时候就可以减少connection的close次数。
但是遇到问题以后就试了试在dao里多次访问的方法里添加:
int i=0;
{
//测试tomcat同一个人每个请求是否只装载一个实例
System.out.println(i++);
}
结果就是1,2,3,,一段时间后刷新。456,所以其实对同一个ip来源,在握手成功后,,调用某一个action,tomcat其实只会实例化一个controller来专门负责此人的接待,此时dao是公用的,
所以一旦某个连接执行完成执行destory就把其他的操作也关闭了。
修改成在每个操作内部
BaseDao dao=new BaseDao();
就好了。缺点是内存占用高,想了下,改成只对会同时调用的方法用这个模式,其他还是原来的全局new ,内存占用就比较合理了。
当然也可以用连接池一类的方法来维护。