我正在开发一个使用 OCI 与 Oracle 通信的客户端-服务器应用程序。过去,我们的应用程序经常将会话视为无限资源,这很可能会损害共享该 Oracle 服务器的其他应用程序。
我试图说服我的开发人员同行,让我们的应用程序与其他人相处融洽,而不是成为这样的资源猪,这一点很重要。
您的 Oracle DBA 在什么时候会认为应用程序过度使用(或滥用)会话?
编辑:目前会话的最大消费者之一是使用直接路径加载并行批量加载多个(20-30)个表的组件。
Jus*_*ave 10
与所有事情一样,这取决于。
如果您使用 OCI,我假设您正在开发客户端/服务器应用程序。在这种情况下,我通常希望数据库支持共享服务器连接,并且当应用程序连接到数据库时,我希望请求共享服务器连接。这通过限制数据库为创建新会话而必须执行的工作量来提高应用程序的性能。这具有在服务器上为其他人留下更多可用资源的副作用。当数据库执行后续查询时,使用共享服务器连接确实涉及更长的代码路径,因为查询必须发送到共享服务器进程,但如果共享服务器进程的数量合理,这通常不是什么大问题。
如果 DBA 未使用自动 PGA 管理,则打开多个会话也可能是一个问题。如果您使用手动 PGA 管理,PGA 是在每个会话的基础上配置的,因此每个会话可以SORT_AREA_SIZE
在其他 PGA 组件之间分配一个单独的排序。如果您使用手动 PGA 管理在数据库中创建了大量会话,并且每个会话都试图最大化其 PGA 使用率,则您很容易使服务器的 RAM 耗尽并导致每个人的性能问题。但是,假设您使用的是 Oracle 10.1 或更高版本,则可以使用自动 PGA 管理。在这种情况下,DBA 会配置一个PGA_AGGREGATE_TARGET
(或MEMORY_TARGET
在 11g 中包含 PGA )并且数据库负责确保所有会话中的聚合 PGA 是有限的,以便数据库耗尽资源。
如果数据库支持共享服务器连接,您的应用程序获得共享服务器连接,并且数据库使用自动 PGA 管理,那么大多数 DBA 不会太在意您创建了多少会话。
现在,如果您要创建许多会话以便可以并行执行更多工作,那么除了会话数量之外,还会产生性能问题。将数据库配置为支持 1000 个会话很容易,例如,如果所有 1000 个会话同时对数据仓库发出大量查询,那么将数据库配置为不会死在一堆中就困难得多。如果您的应用程序耗尽了数据库可用于查询的所有资源,那么 DBA 可能会考虑使用Oracle Resource Manager优先考虑不同的应用程序和/或不同的用户。例如,DBA 可以配置资源管理器,以便在 CPU 利用率达到 100% 时,您的应用程序将获得 50% 的 CPU,其他应用程序将获得 25% 的 CPU,而所有其他应用程序将获得剩余的 25% . 如果没有其他待处理的请求,您的应用程序将可以 100% 地使用所有 CPU。
如果您并行运行事物,调查 Oracle 并行运行语句的能力也可能很有用,因为这可能比编写自己的并行化代码所涉及的开销更少。例如,我希望编写一个客户端应用程序来连续提交使用 Oracle 并行查询执行的语句,而不是打开多个会话并从应用程序的单独线程执行每个语句,这将更容易,也可能更快。 Oracle 没有使用并行查询来执行任何语句。如果使用并行查询,数据库还可以调整产生的并行从库的数量,以便在数据库特别忙时启动较少的并行从库,而在数据库相对空闲时启动更多的并行从库。