我想将以下 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>();
}
}
所以,我会像下面这样填充地图:
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();
}
}
//在这里设置密钥。
Table1Key tk = new Table1Key();
tk.setFk_col1(col1);
tk.setTimestampCol(timestamp);
String ar = actualRateMap.get(tk);
//我主要关心的是..如果sql有timestamp_col =?这将起作用,但是如果timestamp_col <而不是地图中存在的值怎么办?
if(actualRate != null) {
Logger.info("Actual Rate:"+actualRate);
}