Оба подхода плохие.Первый не позволит вам реализовать правильное управление транзакциями, так как вы не можете вызвать несколько методов внутри одной транзакции.Последний требует ненужного создания нескольких объектов.
Наилучшим подходом было бы введение понятия текущего соединения, которое можно получить из некоторого транзакционного контекста.По сути, это должно выглядеть так:
beginTransaction(...); // Opens connection and starts transaction
readRecords(...); // Uses the current connection
addRecord(...);
...
commitTransaction(...); // Commits transaction and closes connection
Самая простая, но не очень элегантная реализация - открыть Connection
внутри вызывающего метода (который определяет границы транзакции) и передать его в ваши методы какпараметр.
Более сложным решением является создание static ThreadLocal
хранилища для текущего Connection
, размещение его там при запуске транзакции и получение его из этого хранилища внутри ваших методов.Некоторые платформы неявно реализуют этот подход, например, Spring Framework .
Обратите внимание, что пул соединений полностью ортогонален этим вопросам.