diff --git a/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/codec/LitePreparedStatementHolder.scala b/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/codec/LitePreparedStatementHolder.scala new file mode 100644 index 00000000..a44e730a --- /dev/null +++ b/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/codec/LitePreparedStatementHolder.scala @@ -0,0 +1,14 @@ +package com.github.mauricio.async.db.mysql.codec + +/** + * optimize memory usage + * we only need statementId,columnSize and parameterSize + */ +class LitePreparedStatementHolder(val statementId: Array[Byte], val columnSize: Int, val parameterSize: Int) + +object LitePreparedStatementHolder { + def apply(preparedStatementHolder: PreparedStatementHolder): LitePreparedStatementHolder = { + val res = new LitePreparedStatementHolder(preparedStatementHolder.statementId, preparedStatementHolder.columns.size, preparedStatementHolder.parameters.size) + res + } +} diff --git a/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/codec/MySQLConnectionHandler.scala b/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/codec/MySQLConnectionHandler.scala index 792aff77..d2977322 100644 --- a/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/codec/MySQLConnectionHandler.scala +++ b/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/codec/MySQLConnectionHandler.scala @@ -59,7 +59,7 @@ class MySQLConnectionHandler( private final val sendLongDataEncoder = new SendLongDataEncoder() private final val currentParameters = new ArrayBuffer[ColumnDefinitionMessage]() private final val currentColumns = new ArrayBuffer[ColumnDefinitionMessage]() - private final val parsedStatements = new HashMap[String,PreparedStatementHolder]() + private final val parsedStatements = new HashMap[String,LitePreparedStatementHolder]() private final val binaryRowDecoder = new BinaryRowDecoder() private var currentPreparedStatementHolder : PreparedStatementHolder = null @@ -201,7 +201,7 @@ class MySQLConnectionHandler( this.parsedStatements.get(preparedStatement.statement) match { case Some( item ) => { - this.executePreparedStatement(item.statementId, item.columns.size, preparedStatement.values, item.parameters) + this.executePreparedStatement(item.statementId, item.columnSize, preparedStatement.values, item.parameterSize) } case None => { decoder.preparedStatementPrepareStarted() @@ -237,8 +237,8 @@ class MySQLConnectionHandler( } } - private def executePreparedStatement( statementId : Array[Byte], columnsCount : Int, values : Seq[Any], parameters : Seq[ColumnDefinitionMessage] ): Future[ChannelFuture] = { - decoder.preparedStatementExecuteStarted(columnsCount, parameters.size) + private def executePreparedStatement( statementId : Array[Byte], columnsCount : Int, values : Seq[Any], parameterSize : Int ): Future[ChannelFuture] = { + decoder.preparedStatementExecuteStarted(columnsCount, parameterSize) this.currentColumns.clear() this.currentParameters.clear() @@ -259,10 +259,10 @@ class MySQLConnectionHandler( } } channelFuture flatMap { _ => - writeAndHandleError(new PreparedStatementExecuteMessage(statementId, values, nonLongIndices.toSet, parameters)) + writeAndHandleError(new PreparedStatementExecuteMessage(statementId, values, nonLongIndices.toSet, parameterSize)) } } else { - writeAndHandleError(new PreparedStatementExecuteMessage(statementId, values, nonLongIndices.toSet, parameters)) + writeAndHandleError(new PreparedStatementExecuteMessage(statementId, values, nonLongIndices.toSet, parameterSize)) } } @@ -308,12 +308,12 @@ class MySQLConnectionHandler( this.currentQuery = new MutableResultSet[ColumnDefinitionMessage](columns) if ( this.currentPreparedStatementHolder != null ) { - this.parsedStatements.put( this.currentPreparedStatementHolder.statement, this.currentPreparedStatementHolder ) + this.parsedStatements.put( this.currentPreparedStatementHolder.statement, LitePreparedStatementHolder(this.currentPreparedStatementHolder) ) this.executePreparedStatement( this.currentPreparedStatementHolder.statementId, this.currentPreparedStatementHolder.columns.size, this.currentPreparedStatement.values, - this.currentPreparedStatementHolder.parameters + this.currentPreparedStatementHolder.parameters.size ) this.currentPreparedStatementHolder = null this.currentPreparedStatement = null diff --git a/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/encoder/PreparedStatementExecuteEncoder.scala b/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/encoder/PreparedStatementExecuteEncoder.scala index c52658c9..18fd9912 100644 --- a/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/encoder/PreparedStatementExecuteEncoder.scala +++ b/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/encoder/PreparedStatementExecuteEncoder.scala @@ -33,7 +33,7 @@ class PreparedStatementExecuteEncoder( rowEncoder : BinaryRowEncoder ) extends M buffer.writeByte(0x00) // no cursor buffer.writeInt(1) - if ( m.parameters.isEmpty ) { + if ( m.parameterSize == 0 ) { buffer } else { Unpooled.wrappedBuffer(buffer, encodeValues(m.values, m.valuesToInclude)) diff --git a/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/message/client/PreparedStatementExecuteMessage.scala b/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/message/client/PreparedStatementExecuteMessage.scala index f87ddede..f8077a8b 100644 --- a/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/message/client/PreparedStatementExecuteMessage.scala +++ b/mysql-async/src/main/scala/com/github/mauricio/async/db/mysql/message/client/PreparedStatementExecuteMessage.scala @@ -22,5 +22,5 @@ case class PreparedStatementExecuteMessage ( statementId : Array[Byte], values : Seq[Any], valuesToInclude : Set[Int], - parameters : Seq[ColumnDefinitionMessage] ) + parameterSize : Int ) extends ClientMessage( ClientMessage.PreparedStatementExecute ) \ No newline at end of file