@Valeriy_Morozov

JDBC, почему нельзя использовать один Connection для нескольких методов в разрезе многопоточности?

Создадим переменную класса
private Connection connection;
// Ее инициализируем в конструкторе

private myManager() {
        String connectionUrl = getConnectionUrl();

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection(connectionUrl);

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }

    }


И используем его для всех CRUD операций в классе.
Я понимаю, что так плохо, но хочу понять почему именно в разрезе многопоточности
1. Что плохого произойдет если два потока одновременно обратятся к конекшену?
2. Разве у каждого из потоков не будет свой экземпляр connection, мы же не создаем его статическим? Соответственно, два потока к одному экземпляру обратиться не могут.
3. База данных же очень ограничена по количеству connection, как она работает, когда будет 100 пользователей программы ( выходит, 100 потоков со своими connection обратятся к ней ).

Я буду очень благодарен за ответы, особенно на 2 вопрос.
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
@Akela_wolf
Extreme Programmer
1. Синхронизация между потоками. Если оба потока начнут посылать запросы в БД через один коннекшен - могут начаться спецэффекты (тут нужно курить "потокобезопасность" коннекшена)
2. Транзакции в БД. Запросы через один коннекшен будут в одной транзакции. Если для вас это ОК - то все ок. Если же разные потоки требуют разных транзакций - то придется каждому потоку выдавать свой коннекшен.
100 пользователей и 100 потоков - это слегка разные вещи. Я бы в первую очередь посмотрел сюда - по потоку на каждого пользователя для меня выглядит подозрительно. Если это веб, то у вас от каждого пользователя приходит запрос, обрабатывается, отправляется ответ. Все. Если от пользователей приходит мало запросов - это может делать и один поток. И даже в случае вебсокетов - все равно не нужно держать по потоку на пользователя.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Можно использовать, но нужно делать синхронизацию между разными потлками.
Проблема в том, что один поток будет ждать ответа на свой запрос, в то время, как другой поток захочет выполнить свой запрос.
Так что, если добавите синхронизацию, то можно.
Но вообще-то не нужно изобретать велосипеды, пользуйтесь пулами соединений, их есть много разных.
Например hikaricp https://habr.com/ru/post/269023/
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы