gpt4 book ai didi

java - 使用 map 缓存来自 sql 的数据(其中包含 <= timestamp col)

转载 作者:行者123 更新时间:2023-11-30 09:26:41 25 4
gpt4 key购买 nike

我想将以下 sql 中的所有数据放在一个映射中(因为这个 sql 被调用了很多次而不是每次都去 db ), 但我想知道如何为时间戳实现 <=

编辑:

我正在使用 Oracle,只是更新了标签,但是,我在 java 中使用 PreparedStatement 缓存查询,无需重新编译,但我们的程序没有缓存解决方案来缓存表中的数据。转到数据库并获取数据需要 2 毫秒的往返时间,但是从 HashMap 获取数据需要纳秒。该查询被执行了大约 20,000 次,我们希望首先加载所有数据并将其放入 Hashmap 中。

编辑结束。

SELECT ar   
FROM table1
WHERE fk_col1 = ?
AND timestamp_col <= ?
ORDER BY date DESC

我的做法是这样的:但是我不确定,equals和hashCode中的timestamp_col是对的。你能建议修改吗?

public class Table1Key
{
private String fk_col1;
private java.sql.Timestamp timestamp_col;
//setters and getters here.
//implementing hashCode and equals.
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((fk_col1 == null) ? 0 : fk_col1.hashCode());
result = prime * result
+ ((timestamp_col == null) ? 0 : timestamp_col.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Table1Key other = (Table1Key) obj;
if (fk_col1 == null) {
if (other.fk_col1 != null)
return false;
} else if (!fk_col1.equals(other.fk_col1))
return false;
if (timestamp_col == null) {
if (other.timestamp_col != null)
return false;
} else if (!timestamp_col.equals(other.timestamp_col))
return false;
return true;
}
}

...

private Map<Table1Key, String> map = Functions.getHashMapInstance();

public class Functions {
...
public static <K,V> HashMap<K,V> getHashMapInstance() {
return new HashMap<K,V>();
}
}

所以,我会像下面这样填充 map :

private void populateMap() throws SQLException {
try {
ps = conn.prepareStatement(table1Sql);
ps.setFetchSize(20000);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
Table1Key rdk = new Table1Key();
String ar = rs.getString(1);
rdk.setFk_col1(rs.getString(2));
rdk.setTimestampCol(rs.getTimestamp(3));
if(actualRateMap.get(rdk) == null) {
actualRateMap.put(rdk, ar);
}
}
} catch (SQLException e) {
e.printStackTrace();
throw e;
} finally {
ps.close();
}
}

//在这里设置 key 。

Table1Key tk = new Table1Key();
tk.setFk_col1(col1);
tk.setTimestampCol(timestamp);
String ar = actualRateMap.get(tk);

//我主要关心的是..如果 sql 有 timestamp_col = ,这会起作用吗?但是如果 timestamp_col < 不是 map 中的内容怎么办?

if(actualRate != null) {
Logger.info("Actual Rate:"+actualRate);
}

最佳答案

HashMap不适合你的情况,而是 TreeMap 可以提供帮助。

a): RangeMap 解决方案

Guava RangeMap旨在处理这种情况:

//Initial RangeMap  
final RangeMap<java.sql.Timestamp, String> cache = TreeRangeMap.create();
...
String value = cache.get(thisTimestamp);
if(value == null){
String queryFromDB = ...;//Query from DB
cache.put(Range.atMost(thisTimestamp), queryFromDB);
value = queryFromDB;
}

当然,'fk_coll' 是个问题。所以你可以定义 Map<String/*fk_coll*/, RangeMap<java.sql.Timestamp, String>>处理此案。

b): <强> TreeMap 解决方案

final TreeMap<java.sql.Timestamp, String> cache = new TreeMap<>();
...
//Get least key greater than or equal to the 'thisTimestamp'
Map.Entry<java.sql.Timestamp, String> entry = cache.ceilingEntry(thisTimestamp);
if(entry == null){
String queryFromDB = ...;//Query from DB
cache.put(thisTimestamp, queryFromDB);
value = queryFromDB;
} else {
value = entry.getValue();
}

HashMap<String/*fk_coll*/, TreeMap<java.sql.Timestamp, String>>

处理“fk_coll”。

另外:驱逐在任何缓​​存情况下都是一个问题。

关于java - 使用 map 缓存来自 sql 的数据(其中包含 <= timestamp col),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14898891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com