cassandra - PreparedStatement 应该在单例类中准备一次,然后在 DAO 实现中引用
问题描述
PreparedStatement 会在每次调用中创建,因此会因负载而影响性能。因此,我需要确保 PreparedStatement 应该在单例类中准备一次并再次重用。如何做到这一点?请任何人为此提供示例代码吗?
解决方案
在最简单的情况下,它可能是这样的:
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,这是自动完成的,因此如果您正在启动新项目,那么最好使用它,因为它包含更多功能。
推荐阅读
- python - Python使用插值将列表中元素的大小增加n个
- sql - 表的左外连接如何工作具有空值
- python - 如何在一个单词中显示前 3 个字母,但在 Python 3 中用“-”破折号替换单词的其余部分
- javascript - 检查数组是否包含给定数字
- angular - Angular 通用升级 8 -> 9 SSR 构建。走下一个错误的兔子洞
- javascript - 从在线 Power BI 仪表板下载数据
- python - Pandas 根据其他列中的条件和值创建新列
- css - 是否有内置方法可以使 Angular 对话框高于中心?
- python - 创建表并将数据流式传输到 db 文件后,无法在 sqlite 中找到我的表
- swift - 为什么蒸汽云部署失败?