我需要您使用以下代码来解决性能瓶颈/改进方面的专业知识。
我有大量(约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的最新可用RATES,并设置了日期上限。
用于执行查询的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);
}
try
{
while(futureCount < dealCount)
{
Future<TestResult> result = completionService.take();
TestResult testResult = result.get();
futureCount++;
testResults.add(testResult);
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
}
catch (Exception ex)
{
ex.printStackTrace();
}
现在, 当我尝试提高性能或发现代码错误时, 我的问题是:
到目前为止,HSQL是我能想到的最快的东西。还尝试了H2,速度要慢一些。
如果我使用1大小的ThreadPool或4线程,几乎没有什么区别。
欢迎任何小费或想法或任何东西!
答案 0 :(得分:0)
我的观点是,当我们处理大量数据时,内存数据库可能会产生问题,因为除非使用分布式内存数据库,否则它将消耗非常大的内存。
如果不使用分布式内存数据库,则另一种选择是使用具有适当驱逐策略的Cache等。
答案 1 :(得分:0)
我不认为在内存数据库中解决该问题的好方法。最重要的是避免全表扫描。在我看来,您拥有正确的索引。看到实际的时间应该是毫秒会很有用。
如果这还不够,您可以将整个结构作为嵌套索引集合或哈希表加载到内存中,并使用java直接直接遍历这些结构。