PreparedStatement将在每个调用中创建,因此,由于负载而影响性能。因此,我需要确保PreparedStatement应该在单例类中准备一次并再次重用。如何做到这一点? Anoyone可以为此提供示例代码吗?
最简单的情况可能是这样:
public class PrepStatementCache {
private static ConcurrentHashMap<String, PreparedStatement> cache = new ConcurrentHashMap<>();
static PreparedStatement getStatement(Session session, final String query) {
return cache.computeIfAbsent(query, q -> session.prepare(query));
}
}
但是由于映射可能在计算过程中被阻塞,因此最好按以下方式实现函数getStatement
:
static PreparedStatement getStatement(Session session, final String query) {
PreparedStatement preparedStatement = cache.get(query);
if (preparedStatement == null) {
preparedStatement = session.prepare(query);
if (preparedStatement != null) {
PreparedStatement p2 = cache.putIfAbsent(query, preparedStatement);
preparedStatement = p2 == null ? preparedStatement : p2;
}
}
return preparedStatement;
}
但是请注意,对于Java驱动程序4,这是自动完成的,因此,如果您要启动新项目,则最好使用它,因为它包含更多功能。