vertx-sql-client icon indicating copy to clipboard operation
vertx-sql-client copied to clipboard

Connection not open CLOSED

Open badrazizi opened this issue 6 years ago • 2 comments

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)

badrazizi avatar Nov 25 '19 00:11 badrazizi

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.

BillyYccc avatar Nov 26 '19 09:11 BillyYccc

see this issue #131 it looks similar

badrazizi avatar Nov 26 '19 18:11 badrazizi

Closing as outdated

tsegismont avatar Feb 06 '23 14:02 tsegismont