mybatis最大绑定多少个变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis最大绑定多少个变量相关的知识,希望对你有一定的参考价值。
参考技术A mybatis最大绑定变量在一万以上,但是容易引发Oracle的bug,导致数据库宕机在内存不足之前我可以声明多少个 const 变量?
【中文标题】在内存不足之前我可以声明多少个 const 变量?【英文标题】:How many const variables can I declare before running out of memory? 【发布时间】:2020-05-24 13:24:28 【问题描述】:我正在编写包含很多 const 变量(主要是整数和枚举)的代码,我想知道,我可以声明的变量的最大数量是多少?我的想法是这些 const 变量分配在堆栈上,这意味着我可以声明大约 1MB/4bytes = 250000 个变量(这很多),假设堆栈的大小为 1MB。我说的对吗?
我的意思的一个简单的例子:
Test.cpp:
const unsigned int VECTOR_ID = 4;
const unsigned int MATRIX_ID = 3;
int main()
std::cout << VECTOR_ID << " : " << MATRIX_ID << std::endl;
return 0;
【问题讨论】:
这些变量是全局变量吗?还是在函数中定义? 它们是用仅在运行时才知道的值初始化的常量吗?或者,它们是用编译时已知的值初始化的常量吗?后者可以优化为根本不使用任何内存 可以将常量放入可执行文件中,这为术语“内存”带来了另一个维度。 常量可能并不总是放在堆栈上。许多编译器将常量放置在可执行文件或内存的只读部分中。只读数据的约束(限制)不同于全局变量或堆栈的约束。您必须检查编译器文档和操作系统文档。 我们已经完成了关于内存的讨论。让我们谈谈变量及其大小。并非所有变量都是 4 个字节。一些变量,如char
和 uint8_t
是 1 个字节。有 16 位变量和 64 位变量。而且,哦,像std::string, std::vector, std::map
这样的美妙容器,它们可能有一个固定的“标题”部分(可能不是 4 个字节)和分配在别处的动态内存。最后,还有那些类和结构,它们的大小取决于程序。总之,您的计算不正确。
【参考方案1】:
请注意,编译时已知的常量可能不对应任何对象;当您在启用优化的情况下进行编译时,常量将作为立即值直接编译到机器指令中。Here 是一个简单的示例。这意味着常量变量的数量没有限制。这也意味着根本不使用的常量可能会完全消失。 (并且如果它们以任何重要的方式使用,代码的大小将超过数据的大小。)
即使你的常量变量确实变成了对象,例如因为它们的地址被占用,它们将被“编译到您的程序中”并成为可执行文件的一部分。
程序的大小及其段的大小受可执行文件格式、系统资源以及可能的构建工具的限制。 Intel page 似乎表明,即使在 64 位架构上(仍然比您的用例大三个数量级),在 Windows 下静态数据(全局常量可能会结束)也限制为 2 GB:
请注意,静态数据和堆栈数据的限制在 32 位和 64 位变体中是相同的。这是由于 Windows 可移植可执行文件 (PE) 文件类型的格式,该文件类型用于描述链接器布局的 EXE 和 DLL。它具有用于图像部分偏移和长度的 32 位字段,并且未针对 Windows 的 64 位变体进行扩展。与在 32 位 Windows 上一样,静态数据和堆栈共享相同的前 2GB 地址空间。
快速搜索似乎表明现代 Linux 中不存在此限制。
【讨论】:
以上是关于mybatis最大绑定多少个变量的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException: ORA-01008: 并非所有变量都使用 Mybatis 3 绑定
MyBatis 整合Oracle 报错:java.sql.SQLException: ORA-01008: 并非所有变量都已绑定