这是我第一次写博客,所以有什么问题,还请大家多多见谅:
1>总结:
数据库中 IN 可以包含的选项数如下:
MySql 数据库:无限制;只是限制了sql语句的大小;
Oracle数据库:9i(256) 10g(1000)
2>MySql max_allowed_packet 操作:
我用的是 MySql (5.6.28) 版本的数据库,可以通过如下命令去查询 MySql 数据库所允许的最大 sql 语句的大小(或长度):
show VARIABLES like '%max_allowed_packet%';
max_allowed_packet 就是记录 MySql 所允许的最大sql语句的长度,单位为bite , 上述为4M
修改 max_allowed_packet :
可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改,
max_allowed_packet=10M
或者通过命令:
set global max_allowed_packet = 10*1024*1024;
3> Java 中,如果查询的sql 语句中,in 的选项数大于 1000 时,对集合进行分割的方法:
1 public classInOperationUtil {2 private static Logger logger = LoggerFactory.getLogger(InOperationUtil.class);3 private static final int IN_LENGTH_LIMIT = 1000;4
5 //为防止in的内容过大,分隔list
6 public static List> divideList(ListdataList){7 List> resultList = new ArrayList>();8 if(CollectionUtils.isEmpty(dataList)) {9 returnresultList;10 }11
12 Integer dataSize =dataList.size();13
14 if(dataSize >IN_LENGTH_LIMIT) {15 int batchSize = dataSize % IN_LENGTH_LIMIT == 0 ? dataSize / IN_LENGTH_LIMIT:dataSize / IN_LENGTH_LIMIT +1;//分批数
16 logger.info("共有 "+dataSize+" 条,分为 "+batchSize+" 批");17
18 for (int i = 0; i < batchSize; i++) {19 //每1000条添加一次
20 int start = i *IN_LENGTH_LIMIT;21 int end = start + IN_LENGTH_LIMIT > dataSize ? dataSize : start +IN_LENGTH_LIMIT;22
23 List divideList =dataList.subList(start, end);24 resultList.add(divideList);25 }26 }else{27 resultList.add(dataList);28 }29 returnresultList;30 }31 }