Выберите, используя спящий режим - PullRequest
15 голосов
/ 15 сентября 2010

Я видел несколько примеров через Интернет Hibernate, используя transaction.commit() для операторов выбора.Ниже приведен пример кода.

public static List<?> list(Class<?> className,int start,int limit,SearchFilter[] searchFilter){
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = null; 

    try {
        transaction = session.beginTransaction();

        Criteria criteria = session.createCriteria(className);
        criteria.setFirstResult(start);
        criteria.setMaxResults(limit);

        for(SearchFilter sf : searchFilter){
            String[] values = sf.getValue();
            if(values != null){
                if(values.length == 1) {
                    criteria.add(Restrictions.eq(sf.getField(), values[0]));
                }else{
                    criteria.add(Restrictions.in(sf.getField(), values));
                }
            }
        }

        List<?> Objects = criteria.list();
        transaction.commit();

        return Objects;
    }catch (Exception e) {
        transaction.rollback();
        e.printStackTrace();
    }finally{
        session.close();
    }

    return null;
}

Почему мы начинаем и фиксируем транзакцию для оператора select?

Ответы [ 4 ]

9 голосов
/ 15 сентября 2010

Я настоятельно рекомендую прочитать Нетранзакционный доступ к данным и режим автоматической фиксации . Позвольте мне процитировать небольшую часть:

(...)

Необходимо рассмотреть еще много вопросов когда вы вводите нетранзакционный доступ к данным в вашем приложении. У нас уже отметил, что введение нового тип транзакции, а именно только для чтения транзакции, может значительно усложнять любые будущие модификации ваше приложение. То же самое верно, если Вы вводите нетранзакционный операции.

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

Мы не рекомендуем использовать режим автоматической фиксации в приложении и применять только операции чтения когда есть очевидная производительность выгода или когда будущие изменения кода крайне маловероятно. Всегда предпочитаю регулярные ACID транзакции для группы ваши операции доступа к данным, независимо от того, читаете ли вы или записать данные.

Сказав это, Hibernate и Java Настойчивость позволяет нетранзакционным доступ к данным. На самом деле EJB 3.0 спецификация заставляет вас получить доступ данные нетранзакционные, если вы хотите реализовать атомную длительную разговоры. Мы подойдем к этому тема в следующей главе. Теперь мы хочу копнуть немного глубже в Последствия режима автоматической фиксации в простое приложение Hibernate. (Заметка что, несмотря на наши негативные замечания, Есть несколько хороших вариантов использования для режим автоматической фиксации. По нашему опыту автокоммит часто включен для неправильные причины, и мы хотели стереть сначала сланец чистый.)

Работа без транзакций с Hibernate

Посмотрите на следующий код, который обращается к базе данных без границы транзакции:

Session session = sessionFactory.openSession(); 
session.get(Item.class, 123l); 
session.close(); 

По умолчанию в среде Java SE с конфигурацией JDBC, это что произойдет, если вы выполните это фрагмент кода:

  1. Открыт новый сеанс. Это не получает соединение с базой данных на этом точка.
  2. Вызов get () запускает SQL SELECT. Сессия теперь получает JDBC Соединение из пула соединений. Hibernate, по умолчанию, сразу отключает режим автоматической фиксации на этом соединение с setAutoCommit (false). Это эффективно запускает JDBC сделка!
  3. SELECT выполняется внутри этой транзакции JDBC. Сессия закрыто, и соединение возвращается в бассейн и выпущен Hibernate - Hibernate вызывает close () на JDBC Подключение. Что происходит с незафиксированная транзакция?

Ответ на этот вопрос таков: зависит! »Спецификация JDBC ничего не говорит об ожидании транзакции при вызове close () связь. Что происходит, зависит от как поставщики реализуют Спецификация. С Oracle JDBC водители, например, вызов close () фиксирует транзакцию! Наиболее другие поставщики JDBC выбирают вменяемый маршрут и откатить любую ожидающую транзакцию когда объект JDBC Connection закрыт и ресурс возвращается бассейн.
Очевидно, это не будет проблемой для ВЫБОРА, который вы выполнили (...)

8 голосов
/ 15 сентября 2010

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

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

Вы должны заключать свои операции в транзакции даже для выборок из-за уровней изоляции и повторяющихся чтений, возникающих при использовании движка MySQL InnoDB.

Ознакомьтесь с проблемой, с которой я здесь столкнулся.

Коллекция Hibernate не обновляется при внешнем добавлении записей

0 голосов
/ 15 сентября 2010

Что ж, коммит на самом деле бесполезен, но, как сказал Псантон, все происходит в рамках транзакции.

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