Традиционный подход заключается в создании DAO (объекта доступа к данным) для каждого класса данных.
т.е. если у вас есть класс данных "Person", у вас также есть класс "PersonDAO", который реализует такие методы, как findById (), findAll (), save (Person) и т. д. В основном класс DAO обрабатывает все взаимодействия с БД.
Конструктор класса DAO может просто принять объект Connection и, таким образом, перенести проблему создания соединений на другой уровень или вызвать метод фабрики где-нибудь, который выделил объект Connection.
В любом случае вам, скорее всего, понадобится такой фабричный метод.
public class Database{
public static Connection getConnection(){
// Create a new connection or use some connection pooling library
}
}
Как кто-то отметил, java.sql.Connection не является потокобезопасным, поэтому вам не следует каждый раз передавать одно и то же соединение, если вы не уверены, что несколько потоков не будут обращаться к методу.
Конечно, если вам нужно создать новое соединение для каждого звонка, вам также нужно будет закрыть соединения, как только вы закончите с ними. Простой подход состоит в том, чтобы добавить метод close () в DAO и заставить их позаботиться об этом. Это накладывает бремя на код, использующий DAO.
Даже если вы используете пул соединений, все равно необходимо закрыть соединения (вернуться в пул), как только вы закончите с ними.
Кто-то предложил использовать локальный поток для подключения к каждому потоку. В некоторых случаях это работает, но не будет полезно для веб-приложения, где каждый запрос является новым потоком (который никогда не используется повторно, а также может не хранить ссылку).
Однако вы можете воспользоваться этим в веб-приложении, если вы настроили его так, чтобы после обработки каждого запроса вызывался вызов Database.closeConnection (), который затем позаботился о закрытии локального соединения Tread, если оно существует.