EnityManagerFactory Singleton. Пожалуйста, просто проверьте? - PullRequest
0 голосов
/ 17 мая 2011

Я просто ужасен, если это выглядит солидно. Это не дает ошибок, но я просто хочу перепроверить, так как у меня проблема с пулом c3p0. Просто проверяю, есть ли причина здесь. Заранее спасибо!

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


public class EntityManagerFactorySingleton {
    private static EntityManagerFactorySingleton singleton;
    private EntityManagerFactory emf;

public EntityManagerFactorySingleton(){
    emf = Persistence.createEntityManagerFactory(ConfigList.getProperty(Config.PERSISTENCE_UNIT), System.getProperties());
}

public synchronized static EntityManagerFactorySingleton getInstance() {
   if(singleton == null) {
    singleton = new EntityManagerFactorySingleton();
   }
   return singleton;
}

public EntityManagerFactory getEntityManagerFactory(){
    return emf;
}

}

Ответы [ 3 ]

2 голосов
/ 17 мая 2011

Ваш код не является "сплошным":

  • конструктор должен быть приватным для одиночного
  • вы не должны синхронизировать метод getInstance(), хотя вам нужно выполнить инициализацию поточно-ориентированной. Это потому, что после инициализации все потоки, которым нужен экземпляр, должны будут ждать друг друга (и это бесполезное узкое место). Только если ваш экземпляр имеет значение null, вызывайте синхронизированный (приватный) метод, который выполняет инициализацию; внутри этого метода проверьте еще раз , если экземпляр имеет значение null. Другой подход состоит в том, чтобы иметь закрытый внутренний класс SingletonHolder, который содержит экземпляр, так что вы будете полагаться на загрузчик классов для выполнения поточно-ориентированной инициализации.

Однако, если вы не можете (не хотите) избегать использования синглтона, очень хорошим выбором будет перечисление с единственной определенной константой: INSTANCE;

public enum EntityManagerFactorySingleton {
    INSTANCE;

    // all your code -- fields, constructor, instance / static methods get in here
    // you can still have the `getInstance()` static method returning INSTANCE, if you want.
}

Единственным недостатком является то, что вы не можете выполнить отложенную инициализацию для INSTANCE, но теперь вы поточно-ориентированы и готовы к проблемам сериализации или клонирования без каких-либо усилий.

0 голосов
/ 17 мая 2011

Кому ответить на ваш вопрос - Я думаю, вы должны сделать конструктор частным, чтобы другие классы не могли создать экземпляр другого EntityManagerFactorySingleton.Однако, если этого не происходит, я не вижу причин, по которым этот класс мог бы вызвать проблему с пулами.

0 голосов
/ 17 мая 2011
  1. Код не является потокобезопасным. (Извините, пропустил synchronized)

  2. Вы не должны использовать синглтоны .

Вместо этого используйте инфраструктуру DI, такую ​​как Spring , guice или, возможно, ваша среда развертывания уже предлагает такую.

Это сделает ваш код намного более надежным и более простым для тестирования.

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