有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数据库正确使用Java内存(保存和排序一百万个RAW)

我需要你的建议

我在DB中有一百万行(仅F.name),我将其保存在ArrayList中。 接下来我需要用正则表达式对它进行排序。但这需要很多时间。我怎样才能使它更快?重要提示:我只需要使用java工具。谢谢你的帮助

这是我的控制器

    @RequestMapping(value = "/contacts", params = "nameFilter")
    @ResponseBody
    public ContactBean contacts(@RequestParam("nameFilter") String nameFilter) {
        filter.setPattern(nameFilter);
        long totalCount = contactDao.count();
        if (totalCount <= MAX) {
            return filter.filterAll();
        } else {
            return filter.startFilter(0, MAX);
        }
    }

    @RequestMapping( value = "/contacts", params = {"nameFilter", "page"})
    @ResponseBody
    public ContactBean contacts(@RequestParam("nameFilter") String nameFilter,
                                 @RequestParam("page") int page,
                                 @RequestParam(value = "cnt", required = false, defaultValue = "1000000") int cntPerPage) {
        filter.setPattern(nameFilter);
        if (page < 0) {
            page = 0;
        }
        if (cntPerPage > MAX || cntPerPage < 1) {
            cntPerPage = MAX;
        }
        return filter.startFilter(page, cntPerPage);
    }
}

这是我的过滤器

@Component("filterService")
@Scope("prototype")
public class Filter {
    private List<ContactEntity> result = new ArrayList<>();
    private static final Logger LOGGER = LoggerFactory.getLogger(Filter.class);

    @Autowired
    private ContactDao contactDao;

    private Pattern pattern;

    public void setPattern(String regex) {
        pattern = Pattern.compile(regex);
    }

    public Pattern getPattern() {
        return pattern;
    }

    private void filterIt(Iterator<ContactEntity> toFilter) {
        while(toFilter.hasNext()) {
            ContactEntity next = toFilter.next();
            if(!pattern.matcher(next.getName()).matches()) {
                result.add(next);
            }
        }
    }

    public ContactBean filterAll() {
        LOGGER.info("Start filtering for all data");
        List<ContactEntity> contacts = (List<ContactEntity>)contactDao.findAll();
        filterIt(contacts.iterator());
        ContactBean model = new ContactBean();
        model.setContacts(result);
        model.setTotalCount(contactDao.count());
        LOGGER.info("Filtering complete");
        return model;
    }

    public ContactBean startFilter(int startPage, int cntPerPage) {
        LOGGER.info("Start filtering");
        Page<ContactEntity> contacts = contactDao.findAll(new PageRequest(startPage, cntPerPage, Sort.Direction.ASC, "id"));
        filterIt(contacts.iterator());
        ContactBean model = new ContactBean();
        model.setContacts(result);
        model.setTotalCount(contactDao.count());
        model.setCurrentPage(startPage);
        model.setTotalPage(contacts.getTotalPages());
        LOGGER.info("Filtering complete");
        return model;
    }
}

共 (0) 个答案