5

有一个基于 Oracle DB Server 的高负载 24/7 系统。
许多客户端应用程序都使用该包pkg1
是否有可能(Oracle 实施或最佳实践)pkg1即时安装新版本的软件包?
我的意思是没有出现“资源繁忙”错误并丢失当前会话等?

4

3 回答 3

7

如果您使用的是 Oracle 11,请查看基于版本的重新定义

于 2012-05-10T13:14:49.380 回答
1

如果您记住一些规则,即使在生产中部署新版本的数据库包也不是问题:

  • 如果某些会话当前正在使用它,则无法部署更新的包主体。为此,您将需要基于版本的重新定义,但根据我的经验,这不应该过于频繁,而可能是您的应用程序的设计缺陷。此外,即使 EBR 也需要启动新会话,afaik。
  • 部署包头会影响其他部分,但通常你会在主体中拥有 99% 的包更新。
  • 为了避免丢失会话信息,创建没有任何包会话数据的包:没有包体代码,没有包变量,既不在标头或正文中,也没有常量(是的,没错,没有 CONSTANT 定义,它们为一些奇怪的东西创建状态原因),没有表功能。最简单的解决这些限制的方法是拥有一个单独的“状态”包,它具有所有这些特性和尽可能少的业务逻辑。

考虑到这一点,您可以创建即使在生产中也可以更新而不会造成任何伤害的包体。如果确实使用了包,则重新编译将等待包上的锁定,在最坏的情况下可能会超时,您需要重试。

同样,如果这一切都无济于事,重新设计可能是必要且有帮助的。

于 2015-04-29T10:59:25.080 回答
0

只要您的包不保持状态(没有全局变量)并且系统可以在包上锁定一毫秒(操作将在 1500(?)秒后超时),您就可以实时部署 PL/SQL 包系统。

于 2014-01-03T20:14:50.250 回答