Лучше инкапсулировать соединение в ДАО, т.е. иметь ДАО создают или получают соединение и затем закрываются, или лучше передать соединение в ДАО и обработать детали в коде, внешнем к ДАО?
Продолжение: Как делают Вас чесотка заключительные соединения, если Вы инкапсулируете соединение в ДАО?
DAO должен выполнять операции CRUD и скрывать эти операции от вызывающих. Итак, вы должны инкапсулировать соединение.
С другой стороны, если верхние уровни координируют DAO (например, транзакции), вы также можете передать соединение в DAO (и закрыть его на том же уровне, на котором вы его открыли, а не в DAO).
Итог ... это действительно зависит от ответственности, которую несет каждый уровень вашего приложения. Должны ли вызывающие абоненты заботиться о том, откуда DAO извлекают данные или нет? Если нет, то инкапсулируйте соединения.
Думаю, вы сами ответили на свой вопрос. Базовый шаблон проектирования объясняет, что DAO должен создавать / извлекать соединение (скажем, через Factory) и скрывать его от любых вызывающих лиц, таких как классы уровня обслуживания.
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
Видите ли вы какие-либо преимущества в сохранении этого внешнего вида?
Исходя из этого с точки зрения удобства использования и стандартов, я думаю, что вы хотите, чтобы DAO заботился о соединениях. Это ведь основная функция доступа к данным.
Подумайте о том, как вы используете, хотите ли вы, чтобы код уровня представления / бизнес-уровня, использующий DAO, знал достаточно о базе данных, чтобы создать соединение для передачи в DAO? Что делать, если вам нужно переместить базу данных или переименовать ее, в этот момент очень хорошо иметь инкапсулированные соединения.
Использование DAO, которое управляет своими собственными соединениями, также позволяет более кратко использовать объекты в вызывающем коде, повышая общую читабельность, IMO.
Я думаю, что ключевым моментом DAO является то, что вы можете поменять местами реализацию без ведома и заботы остального приложения. Я действительно сделал это в проекте. Интерфейс DAO остается прежним, но детали подключения меняются, поэтому вы НЕ МОЖЕТЕ сделать его видимым извне.