可用内存阈值
当一个临时数据库在更新事务的中途耗尽内存时,该事务很可能无法回滚。回滚需要内存来重建内部结构、重新平衡树等。核心运行时通过允许应用程序设置分配阈值,并通过回调监控这些阈值来处理这种情况。(有关更多详细信息,请参阅“监控数据库存储空间使用情况”页面)。这种技术背后的理念是预防内存不足的情况,而不是在资源不可用时尝试处理它们。
McoSqlEngine 类包含两个有助于处理内存不足情况的方法:
void McoSqlEngine::setFreeMemoryThreshold(size_t threshold);
size_t McoSqlEngine::getFreeMemoryThreshold();
第一种方法定义了数据库池中可供 SQL 引擎继续处理的可用空闲数据库内存量(以字节为单位)。
- 此设置取决于数据库访问模式:某些 SQL 语句不需要太多内存,而有些则非常消耗内存。如果所需内存不可用,则当前事务将回滚并引发“内存不足”异常。
第二种方法返回当前的阈值水平。默认的内存阈值为零,不会预先保留任何内存,必须为每个 McoSqlEngine 实例显式设置。McoSqlEngine 的阈值通过构造函数在 McoSqlSession 和 SqlServer 对象中继承。例如,以下代码片段将引擎中的内存阈值设置为 1Mb:
McoSqlEngine engine;
engine.open(...);
engine.setFreeMemoryThreshold(1024*1024); // 设置阈值 1 Mbytes
现在,具有相同 1 Mb 内存阈值的 SqlServer 或 McoSqlSession 对象可以按如下方式实例化:
SqlServer *server = new SqlServer(engine, ...); // 服务器阈值 = 1 Mbytes
McoSqlSession session(engine); // 会话阈值 = 1 Mbytes
现在可以按需覆盖这些对象中的任何对象的内存阈值:
session.setFreeMemoryThreshold(4*1024*1024); // 覆盖会话阈值为 4 Mbytes
server.setFreeMemoryThreshold(0); // 禁用此服务器阈值
还可以通过调用 set_free_memory_threshold()
函数,经由 SQL 来修改阈值。例如:
select set_free_memory_threshold(1024*512);
xSQL 实用程序在作为服务器运行时,默认将内存阈值设置为 1 Mb。此值可通过配置文件中的 free_memory_threshold
设置进行修改。例如:
free_memory_threshold : 4M, # 4 Mbytes
当 xSQL 用作客户端时,可通过调用 set_free_memory_threshold()
函数随时修改内存阈值。