我正在开发一个服务器应用程序,它每天预制各种(可能数百到数千)MySQL查询(SELECTS,INSERTS和& UPDATES)。
查询效果很好,直到....
由于某种原因,在服务器启动大约1到2天之后,每次我尝试从服务器执行任何MySQL查询时都会生成MySQL错误...服务器是使用C ++开发的。
错误显示MySQL客户端内存不足。
我正在使用 MySQL社区服务器5.6.24
是否有某种隐藏的数据存储在内存中,我不知道在MySQL查询执行时会被占用....这是我唯一能想到的。
答案 0 :(得分:0)
这可能与您正在使用的查询有关。
索引可以帮助限制从这些查询返回的结果。
我猜测你正在使用SELECT
命令加载一定数量的数据,并且返回的值需要存储在某个地方,即内存。
http://dev.mysql.com/doc/refman/5.7/en/out-of-memory.html
此链接提供了一些可能的解决方案。
要解决此问题,请先检查您的查询是否正确。应该返回这么多行是否合理?如果没有,请更正查询并再试一次。否则,您可以使用--quick选项调用mysql。这导致它使用mysql_use_result()C API函数来检索结果集,这会减少客户端的负担(但更多的是在服务器上)。
此外,如果您有足够的RAM,可以尝试增加配置文件中的内存限制。
更具体地说,这是您想要调整的内容:
InnoDB
设置
innodb_buffer_pool_size - 默认为128M。这是您要更改的主要设置,因为它设置了InnoDB将用于加载到内存中的数据+索引的内存量。对于专用的MySQL服务器,建议的大小为已安装内存的50-80%。因此,例如,具有64G RAM的服务器应该具有大约50G的缓冲池。
将此值设置得过高的危险在于,操作系统和某些依赖于文件系统缓存的MySQL子系统(如二进制日志和InnoDB的事务日志)将不会留下任何内存。
取自:
http://www.tocker.ca/2013/09/17/what-to-tune-in-mysql-56-after-installation.html
另一种可能性是c ++代码中的某些东西没有分配内存,并且在它完成后正确地释放内存。
答案 1 :(得分:0)
可能泄漏的另一件事是连接。数据库连接非常昂贵,并且存在。我用Google搜索" mysql连接池"。如果您正在使用Connector / J,则可以查看http://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-j2ee-concepts-connection-pooling.html,如果您使用的是连接器/网络,则可以尝试使用http://dev.mysql.com/doc/connector-net/en/connector-net-programming-connection-pooling.html。