BaseModel中定义的变量会在不同线程中冲突吗?

一个继承Model的BaseModel中,定义变量:

protected List<Object> whereParams = new ArrayList<Object>();

所有的model都继承自BaseModel。

在分页查询时,代码如下:

public Page<Record> getJsonPage(Integer pageNum , Integer pageSize , Map<String, String> map) {
  whereParams.clear();
  String select = "SELECT tn.* " ;
  StringBuffer sBuffer = new StringBuffer(" FROM t_novel tn ");		
  if (StrKit.notBlank(map.get("classifyId"))) {
     sb.append(" AND tn.classifyId = ?  ");
     whereParams.add(map.get("classifyId"));
  }
  return Db.paginate(pageNum, pageSize, select, sBuffer.toString() , whereParams.toArray() );
}


运行日志中,偶尔会看到如下错误:

QQ图片20170306091824.png

本地调试时,一切正常。

猜想是不是线程冲突导致?

一个线程还没执行完查询,另外一个线程进入后执行了 

whereParams.clear();

导致这个错误?


评论区

杜福忠

2017-03-06 10:51

protected List whereParams = new ArrayList();

whereParams 又不是静态的, 所以不是它的锅,
我猜想 是你调用了 静态的 dao Model对象吧? 所以whereParams 就混乱了,
推荐你参考一下JFinalUIB的分页封装,写的挺好!

哥! 你得复习一下Java的多态,不然后面会遇到很多不必要的坑,
PS: 用LinkedList 是不是会好些啊?

JFinal

2017-03-06 11:41

在某些情况下,传入的参数个数与 sql 中的问号个数不相同导致的,并非多线程问题,不建议在 BaseModel 中弄个 List,浪费内存,在需要的时候再去 new

nbjgl

2017-03-06 12:09

分页查询都是调用了 静态的 dao Model对象,那么我要修改的话,是不是不能在BaseModel中定义:protected List whereParams = new ArrayList();
了??直接在modal中定义这个就可以了 是吗?

steven_lhcb_9527

2020-12-15 17:32

whereParams定义成局部变量应该就可以了,局部变量都是线程封闭(安全)的

热门反馈

扫码入社