我需要您使用以下代码了解性能瓶颈/改进方面的专业知识。
我有一个巨大的集合(约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 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或想法或任何东西都是受欢迎的!