PreparedStatement должен быть подготовлен один раз в одноэлементном классе, а затем ссылаться в реализации DAO - PullRequest
0 голосов
/ 13 октября 2019

PreparedStatement создается при каждом вызове, и, следовательно, производительность снижается из-за нагрузки. Следовательно, мне нужно убедиться, что PreparedStatement должен быть подготовлен один раз в одноэлементном классе и снова использован повторно. Как этого добиться? Может ли кто-нибудь дать пример кода для этого, пожалуйста?

1 Ответ

0 голосов
/ 13 октября 2019

В простейшем случае это может выглядеть так:

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 это делается автоматически, поэтому, если вы запускаете новый проект, лучше использовать его, так как он содержит больше функций.

...