MySQLNonTransientConnectionException: никакие операции не позволены после закрытия соединения. - PullRequest
0 голосов
/ 13 декабря 2018

Так что я делаю кучу асинхронных вызовов, единственная проблема в моем методе prepare, который генерирует PreparedStatement, он захватывает соединение (или использует новое, если соединение неисправно) и по какой-то причине все еще выдает эту ошибку.

Первоначально я думал (и все еще отчасти), потому что большинство случаев использования этого метода вызываются асинхронно.Таким образом, я сделал метод синхронизированным (никогда раньше не использовал это ключевое слово, но решил, что оно подходит после небольшого исследования), и все же метод выдает ошибку ...

public synchronized PreparedStatement prepare(String statement) throws SQLException {
    Connection c = getConnection();
    if (c == null || c.isClosed()) return getNewConnection().prepareStatement(statement);
    Logger.debug("not null and not closed " + Thread.currentThread().getId());
    return c.prepareStatement(statement); //throws error here
}

Как мне сделать этопоэтому другие потоки не могут изменить соединение, пока с ним не закончится метод prepare?

1 Ответ

0 голосов
/ 13 декабря 2018

Нечто подобное происходит:

Поток 1: вызывает prepare(), создает соединение, возвращает подготовленный оператор и оставляет prepare(), поэтому другие потоки теперь могут вводить prepare()

Поток 1: начинает выполнение запроса

Поток 2: входит в подготовку и проверяет, что соединение в порядке - это то же соединение, которое созданный поток 1 использует и использует.

Поток 1: закрывает соединение

Поток 2: пытается вызвать prepareStatement для соединения, которое теперь закрыто

Вы должны исследовать использование пула соединений, который даст каждому потоку свое собственное соединение, котороевозвращается в пул, когда он «закрыт».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...