preparedstatement应该在单例类中准备一次,然后在dao实现中引用

vnzz0bqm  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(335)

在每次调用中都会创建preparedstatement,因此会因负载而影响性能。因此,我需要确保preparedstatement应该在singleton类中准备一次,然后再次重用。如何做到这一点?有人能给我一个代码示例吗?

k5ifujac

k5ifujac1#

最简单的情况是:

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));
  }
}

但由于map在计算过程中可能会被阻塞,因此实现该函数可能会更好 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,这是自动完成的,因此如果您要启动新项目,那么最好使用它,因为它包含更多的功能。

相关问题