Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Продолжительность транзакции 
V
    Опции темы
Embedded
Дата 26.4.2011, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.2.2011
Где: Россия

Репутация: 1
Всего: 1



Здравствуйте
Просматривая чужой код обнаружил что некоторые программисты между вызовами методов транзакции (JPA) begin() и commit() помещают достаточно большие куски кода, иногда метод с кучей проверок и некоторыми действиями на прямую не связанными с сохранением объекта в БД или загрузой из БД.
Подскажите пожалуйста, а вообще большое значение имеет время прошедшее с начала ( begin() ) транзакции и до ее конца ( commit() )? Мне кажется, что чем короче транзакция по времени тем лучше... 
PM MAIL   Вверх
LSD
Дата 26.4.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 5
Всего: 538



Цитата(Embedded @  26.4.2011,  10:35 Найти цитируемый пост)
Мне кажется, что чем короче транзакция по времени тем лучше...  

С точки зрения СУБД - да. А с точки зрения программиста, лучше автоматически начинать транзакцию при вызове метода и завершать по его окончании.

Кстати Oracle достаточно спокойно относится к длинным транзакциям.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Embedded
Дата 26.4.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.2.2011
Где: Россия

Репутация: 1
Всего: 1



Спасибо за помощь LSD! К сожалению я месяц назад начал изучать Java и почти тогда же БД. Использую PostgreSQL, но многих нюансов не знаю. Как наберу сотню плюс за мной, не забуду)
Еще раз спасибо!
PM MAIL   Вверх
LSD
Дата 26.4.2011, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 5
Всего: 538



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

Пока время работы твоих методов измеряется секундами, можно особо не переживать. Когда оно перейдет на минуты/десятки минут, тут уже стоит думать над оптимизацией.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Embedded
Дата 26.4.2011, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.2.2011
Где: Россия

Репутация: 1
Всего: 1



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

public abstract class TransactionalClass  extends AbstractClass {

    protected abstract void doTransactionWork();
    
    @Override
    protected void doMainWork() {
        HelperTransactionUnit unit = new HelperTransactionUnit() {
            protected void doTransaction() {
                doTransactionalWork();
            }
        };
        unit.execute();
    }

}

Названия дал условные. Вся работа с транзакциями проводится в классе HelperTransactionUnit (в методе execute(), который в свою очередь вызывает  doTransaction() между begin() и commit()), раньше я производил эту работу в TransactionalClass, но мне посоветовали еще добавить класс HelperTransactionUnit дабы уменьшить зависимости, хотя честно сказать у меня проект маленький чтобы возникли подобные проблемы с зависимостями...
Вот такая история.. К сожалению поскольку знаний у меня мало очень, а про разнообразные методы программирования я уже немного почитал, я начинаю думать как облегчить себе жизнь благодаря новым знаниями и не всегда выходит хорошо или даже чаще выходит плохо
PM MAIL   Вверх
LSD
Дата 26.4.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 5
Всего: 538



Можно например использовать декларативные транзакции. В том же спринге это делается довольно просто.
Аннотируешь класс или метод как @Transactional и спринг будет автоматически начинать транзакцию при вызове метода и завершать ее при выходе из метода. Если было исключение, то транзакция будет отменена.
Код

@Transactional
public class DefaultFooService implements FooService {

    Foo getFoo(String fooName);

    Foo getFoo(String fooName, String barName);

    void insertFoo(Foo foo);

    void updateFoo(Foo foo);
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Embedded
Дата 26.4.2011, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.2.2011
Где: Россия

Репутация: 1
Всего: 1



LSD, 
Я начал с урока Stampede и поскольку кода написал много, а до спринга еще не добрался, то подобные радости мне пока еще недоступны. И часто приходится в одной транзакции произвести операции чтения/записи с различными сущностями так, что пока удобно делать как описал выше.
Спасибо за советы и помощь LSD! Не обессудьте уж, что задаю примитивные вопросы, мне еще учиться и учиться...

Это сообщение отредактировал(а) Embedded - 26.4.2011, 12:30
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.