установление соединения с базой данных mysql (вопрос по оптимизации) - PullRequest
0 голосов
/ 27 апреля 2020

Я реализую программу, которая должна установить sh соединение с mysql базой данных. В настоящее время я подключаюсь независимо для каждого класса (например, зарегистрироваться, войти, показать пользователей и т. Д. c), используя следующие строки:

Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3308/myfirstdb","root");

Я думаю о том, чтобы реализовать класс для соединение и вызывать его конструктор по умолчанию каждый раз. Дает ли это какие-либо преимущества / недостатки или не имеет значения. Это класс:

public class MyConnection {

    private Connection con;

    public MyConnection() {

        //establishing connection
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3308/myfirstdb","root","");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    //for future use
    public Connection getCon() {
        return con;
    }
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Это решенная проблема в Java, не пытайтесь написать это самостоятельно. Используйте реализацию javax.sql.DataSource, которая поддерживается пулом соединений (например, Apache DBCP , HikariCP или c3p0 ).

Затем вы можете получить соединение из источника данных для единицы работы и закрыть соединение, когда закончите. Закрытие соединения вернет соединение в пул соединений для повторного использования, что устраняет большую часть накладных расходов на открытие соединения.

0 голосов
/ 28 апреля 2020

За очень редкими исключениями, единственное подключение к базе данных для всей программы - это "правильная" вещь.

Подключение стоит чего-то. Все ваши запросы могут использовать это одно соединение.

Конечно, «конструктор» должен выполнить «соединение». И пусть «деструктор» делает «отключить».

Класс должен быть «одноэлементным» (или эквивалентным), чтобы избежать случайного получения двух соединений.

Ваш код имеет public MyConnection(), что просит пользователя создать несколько соединений. Это должно быть private и вызываться только один раз, например, так:

public Connection getCon() {
    if (con == NULL) {    // or whatever the syntax is
        MyConnection();   // Here's the _one_ connection
    }
    return con;
}

Затем пользователи вызывают getCon(), чтобы получить одно соединение, и использовать его для выполнения запросов.

Остерегайтесь : Если ваш язык поддерживает несколько потоков, выполните одно из следующих действий:

  • Выполняйте операции с базой данных только из одного потока или
  • Иметь (максимум) одно соединение на поток.

PS: я полагаю, что этот совет применим к любому языку OO.

В качестве сноски, установка двух соединений в попытке получить дополнительную производительность, вероятно, будет бесполезной. Или, по крайней мере, не стоит усилий.

Еще одна вещь, о которой нужно знать ... HTTP, в основном, не имеет состояния. Итак, если у вас есть одна веб-страница для «регистрации», которая придет, и go - одно соединение с некоторым количеством SQL-запросов, то она исчезнет. Другая веб-страница для «входа» будет включать другой HTTP-запрос, другое соединение и т. Д. c.

После этого память, в которую пользователь «вошел», должна где-то храниться:

  • В параметрах URL - может быть взломан
  • В кулинарии ie - разумно для легких приложений
  • Другое - Вам нужен совет по безопасности при работе с чувствительными ( информация о кредитной карте, медицинском обслуживании и т. д. c) и необходимо go с веб-страницы на веб-страницу.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...