2017-01-23 7 views
2

Добрый день,
Я пытаюсь создать слой DAO, следуя главным образом this guide.
Обратите внимание, что я не использую никаких фреймворков, просто JDBC.Соединение JDBC внутри слоя DAO

Посмотрите на создание экземпляра соединения:
Внутри каждого метода CRUD мы получаем связь следующим образом:

Connection connection = daoFactory.getConnection(); 

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

  1. Вместо DaoFactory поле, я использую поле Connection, которое я разделяю среди методов. Чтобы иметь одно соединение на DAO. Но тогда, какой уровень должен отвечать за транзакцию? Должен ли я создать что-то между Сервисом - DAO?
  2. Я создаю поля для других экземпляров DAO, необходимых для создания транзакции. Так, например, я бы имел TransactionDao для реализации banktransfer (возьмите деньги у одного пользователя и добавьте в другой), и у этого TransactionDao будет также UserDao, потому что я должен сделать одно создание и два действия обновления.

Я хочу знать правильное решение, возможно, это ни один из вышеперечисленных.
Скажите, пожалуйста, есть ли какие-либо проблемы с параллелизмом, о которых я должен беспокоиться?
Спасибо

+0

ад не имеет никакой ненависти по сравнению с тем, что я чувствую, когда я вижу, что люди голосуют, чтобы закрыть совершенно резонный вопрос, особенно нового пользователя , –

+0

Я предлагаю вам прочитать это http://stackoverflow.com/questions/12812256/how-do-implement-a-dao-manager-using-jdbc-and-connection-pools?answertab=oldest#tab-top Это может помочь вам ответить на ваши собственные вопросы. – fabfas

ответ

1

Самое простое решение, чтобы всегда выполнять транзакции в рамках одного метода DAO, захватывая соединение в начале метода и передачи его остальным методам, которые работают SQL, который должен быть частью этого сделка. Я бы посоветовал вам откатить свою альтернативу этому упрощенному подходу. Весна позволит вам сделать это с помощью волшебства за кулисами, и я уверен, что есть другие рамки для этого, десятки из них, но если вы хотите сохранить его простым, держите его простым. Если некоторые из этих методов также автономный вид, я бы сделал что-то вроде этого:

public void incBalance(int accountId, int val) { 
    Connection conn = daoFactory.getConnection(); 
    incBalance(conn, accountId, val); 
} 

private void incBalance(Connection conn, int accountId, int val) { 
    con.update(...); 
} 

public void transfer(...) { 
    Connection conn = daoFactory.getConnection(); 
    conn.beginTransaction(); 
    ... 
    incBalance(conn, acc1, val); 
    incBalance(conn, acc2, -val); 
    ... 
    conn.commit(); 
} 
+0

Спасибо, просто хотел отредактировать мой пост с похожим кодом, чтобы спросить, правильно ли я понял. Последний вопрос. Могу ли я инкапсулировать incBalance в AccountDao и иметь это поле внутри TransactionDao? Разве это не плохая практика? Так как мой код будет выглядеть как 'accountDao.update (connection, transaction.getReceiver()) и' accountDao.update (connection, transaction.getSender()) '. – Sabine

+0

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