vertx-sql-client
vertx-sql-client copied to clipboard
Connection not open CLOSED
I am using version 3.8.2, lately this exception randomly happen when i execute preparedQuery with Promise.promise(),
Code:
private fun addData(json: JsonObject) {
val dataPromiseList: MutableList<Future<String>> = arrayListOf()
fun insertData(data: JsonObject): Future<String> {
val promise: Promise<String> = Promise.promise()
if (data.containsKey("ID") && data.getValue("ID") is String && !data.getString("ID").isNullOrBlank()) {
var query = "SELECT * FROM `data` WHERE `ID`=?"
var param = Tuple.of(data.getString("ID"))
sqlEngine.preparedQuery(query, param) { exist ->
if (exist.succeeded()) {
val result = exist.result()
if (result.size() > 0) {
query = "UPDATE `data` SET `Title`=?, `Keywords`=?, `Activity`=?, `Type`=?, `State`=? WHERE `ID`=?"
param = Tuple.of(data.getString("Title"), data.getString("Keywords"), data.getInteger("Activity"), data.getString("Type"), data.getString("State"), data.getString("ID"))
sqlEngine.preparedQuery(query, param) { update ->
if (update.succeeded()) {
promise.complete()
} else {
update.cause().printStackTrace()
promise.fail("failed with error: ${update.cause().message}")
}
}
} else {
query = "INSERT INTO `data` (`Title`, `Keywords`, `Activity`, `Type`, `State`) VALUES (?, ?, ?, ?, ?)"
param = Tuple.of(data.getString("Title"), data.getString("Keywords"), data.getInteger("Activity"), data.getString("Type"), data.getString("State"))
sqlEngine.preparedQuery(query, param) { insert ->
if (insert.succeeded()) {
promise.complete()
} else {
insert.cause().printStackTrace()
promise.fail("Insert data failed with error: ${insert.cause().message}")
}
}
}
} else {
promise.fail("Check if data exist failed with error: ${exist.cause().message}")
}
}
} else {
val query = "INSERT INTO `data` (`Title`, `Keywords`, `Activity`, `Type`, `State`) VALUES (?, ?, ?, ?, ?)"
val param = Tuple.of(data.getString("Title"), data.getString("Keywords"), data.getInteger("Activity"), data.getString("Type"), data.getString("State"))
sqlEngine.preparedQuery(query, param) { insert ->
if (insert.succeeded()) {
promise.complete()
} else {
insert.cause().printStackTrace()
promise.fail("Insert data failed with error: ${insert.cause().message}")
}
}
}
return promise.future()
}
if (json.containsKey("data")) {
for (obj in json.getJsonArray("data")) {
dataPromiseList.add(insertData(obj as JsonObject))
}
}
CompositeFuture.join(dataPromiseList.toList()).setHandler { cf ->
if(cf.succeeded()) {
// do stuff
} else {
cf.cause().printStackTrace()
}
}
}
StackTrace
io.vertx.core.VertxException: Connection not open CLOSED
at io.vertx.sqlclient.impl.SocketConnectionBase.schedule(SocketConnectionBase.java:166)
at io.vertx.sqlclient.impl.ConnectionPool$PooledConnection.schedule(ConnectionPool.java:111)
at io.vertx.sqlclient.impl.PoolBase$1$1.schedule(PoolBase.java:99)
at io.vertx.sqlclient.impl.SqlClientBase.lambda$preparedQuery$0(SqlClientBase.java:85)
at io.vertx.sqlclient.impl.PoolBase$1.lambda$onSuccess$0(PoolBase.java:102)
at io.vertx.sqlclient.impl.SocketConnectionBase.handleMessage(SocketConnectionBase.java:210)
at io.vertx.sqlclient.impl.SocketConnectionBase.lambda$init$0(SocketConnectionBase.java:81)
at io.vertx.core.net.impl.NetSocketImpl.lambda$new$2(NetSocketImpl.java:101)
at io.vertx.core.streams.impl.InboundBuffer.handleEvent(InboundBuffer.java:237)
at io.vertx.core.streams.impl.InboundBuffer.write(InboundBuffer.java:127)
at io.vertx.core.net.impl.NetSocketImpl.handleMessage(NetSocketImpl.java:364)
at io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:369)
at io.vertx.core.impl.EventLoopContext.execute(EventLoopContext.java:43)
at io.vertx.core.impl.ContextImpl.executeFromIO(ContextImpl.java:232)
at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:173)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:438)
at io.vertx.mysqlclient.impl.codec.MySQLEncoder.lambda$write$0(MySQLEncoder.java:52)
at io.vertx.mysqlclient.impl.codec.PrepareStatementCodec.handleReadyForQuery(PrepareStatementCodec.java:131)
at io.vertx.mysqlclient.impl.codec.PrepareStatementCodec.handleParamDefinitionsDecodingCompleted(PrepareStatementCodec.java:148)
at io.vertx.mysqlclient.impl.codec.PrepareStatementCodec.decodePayload(PrepareStatementCodec.java:92)
at io.vertx.mysqlclient.impl.codec.MySQLDecoder.decodePayload(MySQLDecoder.java:62)
at io.vertx.mysqlclient.impl.codec.MySQLDecoder.decode(MySQLDecoder.java:51)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:253)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1421)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:697)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:632)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:549)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:511)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:834)
It seems closed connections are held back in the connection pool, this issue is similar to what happens in https://github.com/eclipse-vertx/vertx-sql-client/issues/273.
I think we need to migrate to the vert.x core connection pool first to see if this problem still exists.
see this issue #131 it looks similar
Closing as outdated