Могу ли я иметь проблемы с безопасностью потоков, используя этот подход? - PullRequest
0 голосов
/ 08 января 2012

Я работаю с EJB / JPA и создал статический метод createDataset, который будет искать объект Dataset.Каждый раз, когда мне нужно вставить, обновить, удалить и т. Д. Сущность, я получаю объект DatasetObject, вызывающий DatasetFactory.createDataset (), и вызываю соответствующий метод (вставка, обновление и т. Д.).

Коды:

public class DatasetFactory {
    public static Dataset createDataset() {
        try {
            return (Dataset) new InitialContext().lookup("java:global/.../Dataset");
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }
}

public interface Dataset<T> {
    void insert(T entity);
    //...
}

@Stateless
@EJB(name = "java:global/.../Dataset", beanInterface = Dataset.class)
public class DatasetBean<T> implements Dataset<T> {

    @PersistenceContext(type = PersistenceContextType.TRANSACTION)
    private EntityManager entityManager;

    @Override
    public void insert(T entity) {
        entityManager.persist(entity);
    }
    //...
}

Могу ли я иметь проблемы с безопасностью потоков при использовании этого подхода?Если да, то какие модификации я должен сделать?Должен ли я поместить синхронизированный модификатор в DatasetFactory.createDataset ()?

Большое спасибо!

Ответы [ 3 ]

4 голосов
/ 08 января 2012

Вам никогда не нужно синхронизировать какой-либо метод EJB, потому что спецификация EJB указывает, что экземпляр EJB не может быть вызван двумя параллельными потоками.Контейнер EJB отвечает за синхронизацию и безопасность потоков.Это один из пунктов использования EJB.

1 голос
/ 08 января 2012

С точки зрения безопасности потоков ваш код выглядит хорошо.

Но похоже, что вы реализуете DAO (объект доступа к данным), просто вместо этого вы называете свой DAO набором данных, и не стоит внедрять DAO с использованием EJB, когда контейнер EJB загружается и проверяет все ваши EJB при запуске. и это может замедлить ход событий. И обычно EJB хранят в памяти только определенное количество EJB (пул EJB), но если вы не реализуете свои DAO как EJB, вы можете создать столько их, сколько захотите, и Java GC очистит их для вас.

0 голосов
/ 08 января 2012

, если ваш entitymanager сохраняет потоки, то нет никакого риска использовать ваш метод вставки

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