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

在面临250万个对象的INTEREST_RATES集合查询效率问题时,当前使用HSQL内存数据库并创建了索引。查询涉及获取特定INTEREST_RATE_CD的最新有效利率。Java代码中使用了PreparedStatement执行查询,并通过ExecutorService和CompletionService进行多线程处理。然而,性能提升不明显,即使调整线程池大小也无显著差异。寻求更快的数据结构或替代内存数据库的建议以提高查询性能。
摘要由CSDN通过智能技术生成

我需要您使用以下代码了解性能瓶颈/改进方面的专业知识。

我有一个巨大的集合(约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或想法或任何东西都是受欢迎的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值