@MishaXXL

Какая зависимость в Java приложении к подключению БД?

Из примера в NodeJSпомню, что там подключение к БД инициализировалось один раз и делался экспорт экземпляра объекта подключенного к БД.
В phpвезде через includeпроизводилась вставка куска кода с подключением к БД
include ($_SERVER['DOCUMENT_ROOT'].'/connect.php');

Как в Java реализуется класс, который оперирует подключением к БД?
Это класс со статическим значением
public static Connection DB;

Где мы в методе инициализируем
DB = DriverManager.getConnection("postgres", "postgres", "postgres");


И просто везде обращаемся через подобную конструкцию?
import ru.pack.sql.Database;
Statement st = Database.DB
ResultSet rs = st.executeQuery("SELECT name FROM users");


class Database {
   public static Connection DB;

   public static void createConnect() {
      DB = DriverManager.getConnection(db, "postgres", "postgres");
   }
}


И в main производим
public static void main(String[] args) {
   try {
      Database.createConnect();
   }
}


Или перед каждый запросом производим подключение к БД?
В чем разница подходов между единовременным подключением через создание ссылки в объекте и регулярными подключениями подключениями к БД перед каждым запросом?
Влияет ли как-то на производительность то, что мы перед каждым запросом будем выполнять
Connection conn = DriverManager.getConnection(db, "postgres", "postgres");

или это на столько незначительная операция, что ее можно приравнять к экономии на спичках?

Пример того, из чего я хочу убрать логику БД и вынести в отдельную область.
public static void main(String[] args) {
        try {
            String db = "jdbc:postgresql://localhost:5400/postgres";
            Connection conn = DriverManager.getConnection(db, "postgres", "postgres");

            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("SELECT name FROM users");

            while(rs.next()) {
                System.out.println("name is " + rs.getString("name"));
            }
        }
        catch(Exception ex) {
            System.out.println("DB exception: " + ex);
        }

       try(ServerSocket server = new ServerSocket(8080)) {
            while(true) {
                try(Socket client = server.accept()) {
                    handleRequest(client);
                }
            }
        }
        catch(IOException ex) {
            System.out.println("Exception: " + ex);
        }
}
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
1. Java (JDK/JRE) не содержит в себе драйверов доступа к БД вообще. В ней определен только базовый
интерфейс java.sql.* и существует некий стандарт на то как драйверы должны работать. Например когда мы делаем ResultSet::close, или Statement::close, драйвер может ничего и не делать в этот момент. Все зависит от того
как производитель (Oracle, MSSQL) реализовал под капотом работу драйвера. Поэтому как работает внутри драйвер это - тайна.

2. Обычно если в приложении тебе часто и много нужно создавать объектов Connection, то используют пулы коннектов (Hikari Connection pool, DBCP, C3PO). Почитай в этом направлении. Пулы экономят сессионные
объекты на стороне БД и создают новые коннекты быстрее за счет переиспользования сущесвтующих коннектов.
В обычном (прямом режиме) работы с БД процесс установки соединения может занимать несколько секунд.
Это может быть запредельно медленно для некоторых алгоритмов.

3. В сложных ent. приложениях используются фреймворки типа Spring которые декларируют зависимости одник
компонент от других
и также обеспечивают ленивую инициализацию и работу синглтона. Всем новичкам
нужно знать что такое синглтон и уметь им пользоваться. И лучше уметь это сначала без фреймворка
чтобы понимать уже как это делает фреймворк.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@nApoBo3
Обычно это делается через инъекцию зависимостей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы