OB可以对正在执行的存储过程进行编译嘛?
我觉得应该不行
Oracle编译的时候如果在用都会卡住
但是OB可以,刚刚试了一下,执行中进行修改保存编译,关闭后打开是编译后的版本,和ORACLE的机制不同,所以奇怪,OB执行用的是之前缓存的版本,同时执行更新编译,不太清楚原理是什么
估计类似MVCC机制一样,整了多个版本
你好咨询了下研发,存储过程这块是跟oracle类似的。ob执行期间要么用缓存,如果缓存不可用会重新编译。不会同时做的
根据文档库中的信息,OceanBase 数据库的 PL 代码(包括存储过程)仅支持编译执行,并且编译后的代码会被缓存在 PL 缓存中。具体机制如下(依据的文档名称及段落标题:PL 执行机制):
-
PL 编译与缓存机制
当定义一个存储过程时,其 PL 代码会被存储在 OBServer 中。当应用程序首次调用该存储过程时,OBServer 会从数据字典中读取 PL 代码的定义,并将其编译为可执行的二进制代码。编译后的代码会被存储到 PL 缓存中,以便后续调用可以直接使用缓存中的版本,而无需重新编译。 -
正在执行的存储过程与更新编译
如果一个存储过程正在执行,同时对其进行了修改并重新编译,那么当前正在执行的实例仍然会使用之前缓存的版本完成执行。这是因为 OceanBase 数据库在调用存储过程时,会锁定当前使用的编译版本,确保执行的一致性和稳定性。只有在存储过程执行完成后,下一次调用才会使用新编译的版本。 -
与 Oracle 的差异
您提到的现象确实与 Oracle 的机制不同。在 Oracle 中,如果对一个正在执行的存储过程进行重新编译,可能会导致运行中的会话出现问题(例如 ORA-04068 错误)。而在 OceanBase 中,由于采用了 PL 缓存机制,可以保证正在执行的存储过程不受重新编译的影响,从而提升了系统的稳定性和可靠性。
总结来说,OceanBase 数据库允许在存储过程执行期间对其进行修改和重新编译,但当前正在执行的实例会继续使用之前的编译版本,直到执行完成。这种设计避免了因动态修改而导致的运行时问题,同时也符合分布式数据库的设计原则。
更多信息请查看: