Я ищу способ вызова нескольких функций DAO в транзакции, но я НЕ использую весну или какую-либо такую структуру. Фактически у нас есть тип API базы данных .jar
, который инициализируется используемым источником данных. То, что я хочу достичь, это иметь свой код бизнес-логики на уровне сделать что-то вроде:Как вызвать несколько функций DAO в транзакции
Connection conn = datasource.getConnection();
conn.setAutoCommit(false);
DAOObject1.query1(params, conn);
DAOObject2.query4(params, conn);
conn.commit();
conn.setAutoCommit(false);
однако я хочу, чтобы избежать передачи объекта соединения в каждой отдельной функции, так как это не правильный способ сделать это. Сейчас в нескольких транзакциях мы используем это, но мы ищем способ остановить передачу объекта соединения на уровень базы данных или даже создать его за его пределами. Я ищу что-то вроде:
//Pseudocode
try{
Datasource.startTransactionLogic();
DAO1.query(params);
DAO2.query(params);
Datasource.endAndCommitTransactionLogic();
}
catch(SQLException e){
Datasource.rollbackTransaction();
}
Могу ли я достичь этого через EJB? Прямо сейчас мы не используем DAO через инъекцию, мы создаем их вручную, но мы собираемся перейти на EJB и начать использовать их через контейнер. Я слышал, что все запросы, выполняемые EJB, являются транзакционными, но как он знает, к чему откатиться? Через savepoints
?
EDIT:
Позвольте мне указать на то, что метод каждого DAO
объекта, прямо сейчас, получает свой собственный объект подключения. Вот пример того, как наши DAO
классов будут:
public class DAO {
public DTO exampleQueryMethod(Integer id) {
DTO object = null;
String sql = "SELECT * FROM TABLE_1 WHERE ID = ?";
try (
Connection connection = datasourceObject.getConnection();
PreparedStatement statement = connection.prepareStatement(sql)
) {
statement.setInt(1, id);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
object = DAO.map(resultSet);
}
}
}
return object;
}
}
Прямо сейчас, что мы делаем для методов, которые должны быть в транзакции, чтобы иметь вторую копию из них, которые получают Connection
объекта:
public void exampleUpdateMethod(DTO object, Connection connection) {
//table update logic
}
То, что мы хотим, чтобы избежать таких методов в нашей «API базы данных» .jar
, но вместо того, чтобы быть в состоянии определить начало и совершать сделки в нашей бизнес-логике, как упоминался в псевдокоде выше.
С EJB (или весной) у вас будет нечто гораздо более простое, безопасное и многоразовое, чем то, что вы желаете. Нет необходимости запускать, совершать и откатывать транзакцию по коду. Если исключение из среды выполнения выбрано из транзакционного метода, транзакция будет автоматически отменена. –
Да, но я ищу способ реализовать транзакционную логику. Могу ли я просто добавить '@ Transactional' в функцию, которая вызывает несколько методов DAO и перезапустить все изменения базы данных при исключении из среды выполнения? В качестве примера у меня есть метод, который создает объект, а затем записывает информацию о двух разных таблицах (всего 3 метода DAO). Если третий метод выбрасывает исключение во время выполнения, я хочу отменить все, даже создание объекта. – Konstantine
Да, это именно то, что делают транзакционные методы EJB и Spring. –