Почему в JPA «слишком много связей»? - PullRequest
3 голосов
/ 23 августа 2011

Это мой код (это JAX-RS + JPA):

@Path("/")
public class Foo {
  private static final EntityManagerFactory FACTORY = 
    Persistence.createEntityManagerFactory("foo");
  @POST
  public void save(String name) {
    EntityManager em = this.FACTORY.createEntityManager();
    EntityTransaction trans = em.getTransaction();
    trans.begin();
    MyEntity entity = new MyEntity();
    em.persist(entity);
    em.flush();
    trans.commit();
    em.close();
  }
}

Я использую OpenJPA 1.2.2.Соединения с MySQL никогда не закрываются, и через некоторое время я вижу «слишком много соединений».Что не так с этим дизайном?

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

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

Поместите свой код в блоки finally, чтобы они гарантированно выполнялись.

См. эту ссылку для объяснения.

0 голосов
/ 23 августа 2011

Возможно, вы используете пул подключения. OpenJPA вместо создания нового соединения для каждого вызова БД, что является очень дорогостоящей задачей, берет соединение из пула, и когда соединение больше не требуется, оно возвращается в пул. Это в основном из соображений производительности, т. Е. Hibernate использует для этого библиотеку пулов соединений c3p0, а также есть другая библиотека под названием dbcp (пул соединений с базами данных) от Apache, которая выполняет аналогичные функции.

...