Поддерживать соединение с БД с использованием JPA / Hibernate - PullRequest
1 голос
/ 13 августа 2010

Я использую JPA и Hibernate в приложении. (с PostgreSQL в качестве СУБД)

Я выполняю много операторов выбора, чтобы получить элементы, хранящиеся в БД по их имени.

Я использую следующий код:

    //em is the javax.persistence.EntityManager Object.
    Query q = em.createQuery("Select i from Item i where i.name = :name");

    q.setParameter("name", nameParam);

    List<NavigationItem> results = q.getResultList();

Итак, моя проблема в том, что я теряю много времени, подключаясь к БД, подготавливая оператор и закрывая соединение. Я использовал Eclipse TPTP, чтобы отслеживать, какие методы стоят больше всего времени: (в минуту)

com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery (): ~ 22 с com.mchange.v2.c3p0.impl.NewProxyConnection (). close (): ~ 16 с com.mchange.v2.c3p0.impl.NewProxyConnection (). prepareStatement (String): ~ 12 с com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource (). getConnetction (): ~ 6 с com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.close (): ~ 4 с

Выполнение запроса требует своего времени, это нормально, но я думаю, что другим методам нужно больше времени, чем нужно. Если бы я мог держать соединение открытым для нескольких (или нескольких сотен) выполнений, приложение было бы намного быстрее.

Итак, мой вопрос: как я могу сохранить это соединение открытым?

1 Ответ

1 голос
/ 13 августа 2010

Профилирование оказывает некоторое влияние на производительность, но, тем не менее, время выполнения, о котором сообщается ей, безумно sloooowww , и это неожиданно.Я имею в виду, что вы используете пул соединений, и, таким образом, получение соединения и его закрытие должно быть почти мгновенным, эти операции вообще не должны быть проблемой - в этом-то и заключается смысл использования пула соединений.И время для подготовки заявления смехотворно велико.

Где-то что-то не так, и сохранение открытого соединения определенно не является решением (пул должен просто работать).Но для диагностики недостаточно информации.Итак, не могли бы вы добавить некоторые сведения о:

  • Контекст (out-container? In-container?)
  • Конфигурация пула соединений.
  • Кодокружая фрагмент, который вы показываете.

В качестве примечания следует отдать предпочтение использованию именованных запросов (они чаще всего прекомпилируются провайдером JPA, чтобы избежать лишних операций при разборе JPQL и генерации SQL каждый раз).Но это не проблема здесь.Основная причина должна быть устранена.

Ресурсы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...