为了账号安全,请及时绑定邮箱和手机立即绑定

多次查询大量集合。有更高性能的解决方案吗?

多次查询大量集合。有更高性能的解决方案吗?

扬帆大鱼 2019-04-26 17:15:06
我需要您使用以下代码了解性能瓶颈/改进方面的专业知识。我有一个巨大的集合(约250万个对象)的INTEREST_RATES来反复遍历并获取和返回拟合条目列表。我目前的解决方案是HSQL内存数据库:INTEREST_RATE表结构:CREATE MEMORY TABLE INTEREST_RATES " +"(EFFECTIVE_DATE DATE not NULL, "+ "INTEREST_RATE DOUBLE not NULL, "+ "INTEREST_RATE_CD INT not NULL, "+ "INTEREST_RATE_TERM INT not NULL, "+ "INTEREST_RATE_TERM_MULT VARCHAR(5) not NULL,"+ "TERM_IN_DAYS DOUBLE not NULL,"+ "PRIMARY KEY (EFFECTIVE_DATE, INTEREST_RATE_CD, INTEREST_RATE_TERM, INTEREST_RATE_TERM_MULT))"CREATE INDEX dtidx ON INTEREST_RATES (EFFECTIVE_DATE, INTEREST_RATE_CD)查询:SELECT * from INTEREST_RATES where INTEREST_RATE_CD = ? and EFFECTIVE_DATE = (SELECT MAX(EFFECTIVE_DATE) from INTEREST_RATES where INTEREST_RATE_CD = ? AND EFFECTIVE_DATE <= ?)- >所以,我正在尝试获取特定INTEREST_RATE_CD的最新可用比率,给出一个上限日期。Java部分执行查询:PreparedStatement p = con.prepareStatement(sql);p.setLong(1, intRateCd);p.setLong(2, intRateCd);p.setDate(3, someDate);ResultSet r = p.executeQuery();return resultSetToList(r);使用Futures / multithreading的Java主循环:ExecutorService executor  = Executors.newFixedThreadPool(4);CompletionService<TestResult> completionService = new ExecutorCompletionService<>(executor);long futureCount = 0;while(deals.next()) //deals is a ScrollableResults set from Hibernate{                           IDealEntity deal = (IDealEntity) deals.get()[0];    //These tasks contain the INTEREST_RATE query action    QueryTask task = new QueryTask(some params...);    completionService.submit(task);     }           现在,当我尝试提高性能或在代码中发现错误时,我的问题是:你能想出一个比inmem db更快的东西来反复获取查询逻辑后的对象吗?有没有更好/更快/任何数据结构?到目前为止,HSQL是我能想到的最快的东西。也试过H2,这是waaaaay慢。有趣的是,我使用多线程和ExecutorService的实验并没有真正改变任何性能。如果我使用1个大小的ThreadPool或4个线程,几乎没有区别......任何tipps或想法或任何东西都是受欢迎的!
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

我的观点是,当我们处理非常大量的数据时,内存数据库可能会产生问题,因为它会消耗非常大的内存,除非使用分布式内存数据库。

如果不使用分布式内存数据库,另一种替代方法可能是使用具有适当驱逐策略等的Cache。


查看完整回答
反对 回复 2019-05-15
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

我不认为在内存数据库中是解决它的好方法。最重要的是避免全表扫描。在我看来,你有正确的索引。看到真正的时间应该是毫秒是很有用的。

如果这还不够,您可以将整个结构作为嵌套索引集合或散列表加载到内存中,并使用java直接遍历这些集合。


查看完整回答
反对 回复 2019-05-15
  • 2 回答
  • 0 关注
  • 454 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号