Как отменить длительный запрос MySQL через JDBC?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как отменить длительный запрос MySQL через JDBC?

Сообщение Anonymous »

У меня есть длительный запрос, который я запускаю к ​​базе данных MySQL 8 через JDBC. Моя цель - иметь возможность выйти из этого запроса по какому-либо триггеру (например, внешнему сигналу, ошибке обработки данных и т. д.) и отменить запрос. Судя по моим тестам и исследованиям на форумах MySQL, оператор Statement.cancel() на самом деле ничего не делает.
Как мне этого добиться? Есть ли другой способ, кроме как вызвать KILL
для отдельного соединения? Если да, то я могу это сделать, но не понимаю, как определить точный PID моего длительного запроса. Есть ли для этого надежный метод?
Короче, как я могу, используя MySQL Connector J, отменить длительный запрос по требованию? Я был бы очень признателен за ссылку на рабочий пример с кодом, если это вообще возможно.
Для справки, вот пример кода, написанного на Kotlin:
< pre class="lang-kotlin Prettyprint-override">

Код: Выделить всё

val data = produce {
db.connection.use { conn ->
conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY).use { stmt ->
stmt.fetchSize = Int.MIN_VALUE
stmt.executeQuery("...").use { rs ->
var batch = mutableListOf()
while (rs.next()) {
// Handle result set here
val data = Data(
id = rs.getLong("id"),
subAccountId = rs.getInt("sub_account_id")
)
batch.add(data)
if (batch.size >= 100) {
println("Sending batch...")
send(batch)
if (done) {
println("Done, closing...")
close()
break
}
batch = mutableListOf()
}
}
println("Out of loop, cancelling statement")
synchronized(this) { // my lame attempt at cancelling
println("In synchronized")
if (!stmt.isClosed) {
println("Statement is not yet closed") // DOES print
stmt.cancel()
stmt.close()
conn.close() // probably pointless but I tried
}
}
}
println("Out of statement") // does NOT print
}
println("Out of connection") // does NOT print
}
println("End of production...") // does NOT print
}
Я могу видеть в консоли надпись «Операция еще не закрыта», но ничего кроме этого.

Подробнее здесь: https://stackoverflow.com/questions/786 ... y-via-jdbc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»