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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DAO + транзакции 
:(
    Опции темы
GShadrin
Дата 27.7.2013, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день.

Не могу придумать как хорошо увязать паттерн DAO и использование транзаций.

На данный момент:

Код

package ts.daoService;

import java.sql.SQLException;
import java.util.List;

import ts.daoService.exceptions.DAOException;
import ts.daoService.exceptions.DAOFactoryException;
import ts.global.baseModels.BaseModel;

public interface IDAO<PK, Model extends BaseModel<PK>> {    
    
    public Model saveObject(Model entity) throws DAOException, DAOFactoryException;
    
    public void deleteObject(Model entity) throws DAOException, DAOFactoryException;

    public void deleteObject(PK id) throws DAOException, DAOFactoryException;

    public Model getObject(PK id) throws DAOException, DAOFactoryException;
 
    public List<Model> getAllObjects() throws DAOException, DAOFactoryException;
 
    public int getAllObjectsCount() throws DAOException, DAOFactoryException; 

}


Код

public abstract class DAOFactory
{    
    public abstract IDAO1 getDAO1();

    public abstract IDAO1 getDAO2();

}


Код

public class MySQL_DAOFactory extends DAOFactory
{    
    
        
    public MySQL_XML_DAOFactory(File configFile) throws MySQLConnectionDriverLoadException, MySQLPropertiesLoadException 
    {
        
        //...
    }
        
    
    public Connection getConnection() throws MySQLGetConnectionException 
    {
        // получаем connection из пула
    }
    
    @Override
    public TestDescriptorDAO_MySQL getTestDescriptorDAO()
    {
        return new TestDescriptorDAO_MySQL();
    }

    @Override
    public IDAO1 getDAO1()
       {
            return new DAO1_MYSQL();
        }

        @Override
    public IDAO1 getDAO2()
        {
             return new DAO2_MYSQL();
        }
        
}



Connection получаю внутри DAO вызовом

Код

Connection conn = ((MySQL_XML_DAOFactory) DAOService.get()).getConnection();


Нужны транзакции. Как вариант передавать connection в конструктор DAO и обернуть создание и коммит транзакции в DAOFactory. Но в таком случае в бизнес логику попадает некая логика работы с Connection (получение из Factory, передача в конструктор).

Может быть кто-то может подсказать правильную реализацию DAO с транзакциями.

Это сообщение отредактировал(а) GShadrin - 27.7.2013, 19:28
PM MAIL   Вверх
Stolzen
Дата 27.7.2013, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

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



Вы используете какой-нибудь IoC контейнер для склеивания? Например, Спринг? В этом случае типичным решением было бы использовать аспекты, которые отвечают за работу транзакций.

Если нет возможность использовать АОП, вполне можно сделать это самому с помощью паттерна декоратор. 

И последнее, часто более правильным решением было бы управлять транзакциями на уровле служб, а не ДАО - т.е. открывать транзакцию перед выполнением какого-либо бизнес кейса, а закрывать только в случае успешного его завершения. 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
GShadrin
Дата 28.7.2013, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Stolzen @ 27.7.2013,  20:19)
Вы используете какой-нибудь IoC контейнер для склеивания? Например, Спринг? В этом случае типичным решением было бы использовать аспекты, которые отвечают за работу транзакций.

Если нет возможность использовать АОП, вполне можно сделать это самому с помощью паттерна декоратор. 

И последнее, часто более правильным решением было бы управлять транзакциями на уровле служб, а не ДАО - т.е. открывать транзакцию перед выполнением какого-либо бизнес кейса, а закрывать только в случае успешного его завершения.

IoC контейнер не использую. Компоненты системы в принципе разнесены на модули, при старте системы определяется какие реализации компонент использовать

Код

public class DAOService
{
    private static DAOFactory st_instance;    
    
    public static void init(DAOFactory instance)
    {
        st_instance = instance;
    }
    
    public static DAOFactory get()
    {
        return st_instance;
    }
}


Затем вызывается примерно так:
Код

        DAOService.get().getUserDAO().getAuthRec(login);


Конечно в какой-то степени велосипеды.
В принципе думал вынести логику транзакций в отдельный компонент. В бизнес логике при старте бизнес кейса создавать/закрывать транзакцию. В таком случае придется все операции с DAO выполнять в одном Connection, но не хочу, чтобы бизнес действия вообще что-то знали про Сonnection.

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

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

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


 




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


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

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