以前不怎么用MYSQL,前两天在测试使用activiti工作流引擎的时候,使用MYSQL 5.1.X作为后台数据库,工作流引警在执行一条简单的SQL时,报了一条第一印象很奇怪的SQL异常.SQL Message内容为 Out of memory; restart server and try again . 因为Out of memory这种提示最常见的情景是在OOM异常的情况下,显然这里报的是SQLException而非OOMException.于是乎我就在网上搜了一下,并未找到相关解释。自己也一时也没能想明白,还折腾了好一会儿。后来又仔细看了一下异常堆栈,如下:
Caused by: java.sql.SQLException: Out of memory; restart server and try again (needed 65528 bytes)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1342)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:840)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
发现最后的那个 needed 65528 bytes 提示,灵光一现,立马查看MYSQL配置信息文件中的相关配置,看看哪个配置项小于64K,查看配置文件的确发现有几项配置小于等于64K,根据实际SQL (select distinct RES.* from ACT_RE_MODEL RES WHERE RES.DEPLOYMENT_ID_ = ? order by RES.ID_ asc LIMIT ? OFFSET ?)判断可能是sort_buffer_size这个配置项过小,修改为128K重启数据库后SQL执行就正常。
后经求证,此配置项在MYSQL5.5.X中默认值为256K。
--转自