我有一个客户端服务器Corba应用程序。对于某些调用,由于返回的数据量很大,服务器会为客户端提供一个迭代器对象。当前实现-服务器从(MySQL)数据库获取所有相关数据,并保留在内存中,直到客户端完成所有数据的获取(通过getNext_n()调用)。已经有对迭代器总数和生存期的限制(逐出模式)。现在,如果大多数打开的迭代器具有大量数据,则服务器有时会变得内存不足。


处理这种情况的最佳方法是什么?
相反,我们可以分块(使用Limit)从数据库中获取数据,而不是在本地进行缓存。但是,如果其他一些线程在表中插入/删除行;选择将返回不一致的数据。依次使用临时表意味着额外的磁盘使用量。 MySQL是否提供任何其他机制来处理这种情况?

最佳答案

您不需要在Corba服务器上从MySQL缓冲任何内容。
您可以在服务器上执行MySQL查询,并将迭代器发送到客户端。
然后,您从MySQL查询结果集中获取一行并将其立即发送给客户端。并对结果集中的所有行重复此操作。

您需要注意的是为迭代器设置超时。客户必须在一段时间内完成一次迭代。该时间应小于MySQL允许从结果集中两次读取行之间经过的时间。

另外,需要超时,因为如果查询期间查询表中的数据发生更改,则如果结果获取花费太多时间,它可能会填充MySQL UNDO日志。

10-08 08:18