首页 > 解决方案 > PreparedStatement 应该在单例类中准备一次,然后在 DAO 实现中引用

问题描述

PreparedStatement 会在每次调用中创建,因此会因负载而影响性能。因此,我需要确保 PreparedStatement 应该在单例类中准备一次并再次重用。如何做到这一点?请任何人为此提供示例代码吗?

标签: cassandrasingletonprepared-statement

解决方案


在最简单的情况下,它可能是这样的:

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,这是自动完成的,因此如果您正在启动新项目,那么最好使用它,因为它包含更多功能。


推荐阅读