【问题标题】:Relation between Oracle session and connection poolOracle会话与连接池的关系
【发布时间】:2010-11-05 14:15:57
【问题描述】:

让我先解释一下设置。

我们有一个运行在 2GB RAM 机器上的 oracle 服务器。 Db 实例的 init 参数“sessions”设置为 160。

我们在 Websphere 6.1 上部署了应用程序。连接池设置为 Min 50 和 Max 150。

当我们对 40 个用户(并发,使用 jMeter)运行负载测试时,一切正常。 但是当我们将并发用户增加到超过 60 时,Oracle 会抛出它超出会话的异常。

我们检查了应用程序是否存在任何连接泄漏,但找不到任何连接泄漏。

那么这是否意味着 40 的并发是这个设置可以接受的?增加 Oracle 会话/进程是获得更高并发性的唯一方法吗?

连接池中的数据库会话和连接究竟是如何相关的?据我了解,连接不能超过会话,因此将最大连接池设置为超过会话可能并不重要。对吗?

【问题讨论】:

  • 你可能要考虑把它放在 serverfault 上。
  • 不幸的是,这完全是编程相关的。
  • @Terry - 是的,但 Oracle DBA 可能比普通程序员更了解这一点。
  • 我嫁给了一位 Oracle DBA。我是一名 Java 开发人员。我们仍然没有找到答案,这是我多次问过她的问题。
  • 您能发布确切的 ORA 错误代码吗? Oracle 可以在一个物理连接上多路复用多个会话。如果连接池只是试图在现有物理连接上打开新会话,那么您可能会达到连接上的最大会话数,而不是数据库可以支持的最大会话数。连接池是自定义的,还是通过 Websphere 提供的?

标签: oracle oracle10g connection websphere


【解决方案1】:

在 Google 图书上查看此 book。它解释了连接和会话之间的区别。

【讨论】:

  • (由于没有添加 cmets - 我不妨指出该链接值得一看。它直接跳转到有关 Oracle 的书中感兴趣的有用章节。)
  • 更有用的答案是解释书中描述的内容。该链接提供了丰富的信息,但我仍然想知道 OP 描述的性能问题。
  • 另外,Google 图书屏蔽了一些相关的重要页面,所以在这里总结会更好。
【解决方案2】:

Metalink 对 SESSIONS 参数给出以下建议:

递归会话是正常运行的重要组成部分 关系数据库管理系统。无法识别 需要的每一种情况 此类会议,但一般来说,如果 用户启动的操作需要 数据字典的操作 对象,然后递归会话可能 被创建。举个简单的例子, 假设您在登录时创建了一个表 作为一些普通用户。在...后面 场景这必须将行插入 obj$、tab$ 等属于 SYS 用户。由于普通用户会 无权插入这些 对象,递归会话是 以 SYS 身份登录。

解决方案:

增加 SESSIONS 参数。

建议保留 50% 递归的 SESSIONS 值 会议。所以,例如,如果它是 预计会有 30 个客户会话 打开,然后设置 SESSIONS 参数 到 60。

因此,根据 websphere 和您的用户进程正在执行的操作,这可以部分解释您所看到的内容。

【讨论】:

    【解决方案3】:

    我的 v$session 包含 30 个条目,其中 4 个有用户名(其中一个是后台作业)。

    如果您有后台进程(例如批处理作业),它们可能会占用会话。

    但可能只是内存不足。对于 50 个会话的连接池,2GB 似乎有点低。假设Oracle 10g,你的RAM分为共享(SGA)和进程(PGA)。假设您有 1.5GB 用于 SGA,那么剩下 500MB 用于所有会话。如果每个会话占用 10MB,您将达到大约 50 个会话的限制。

    实际上, 1. 你会在盒子上运行一些其他“东西”,所以不会有完整的 2GB 可供 Oracle 使用

    1. 您的 SGA 可能更小或更大
    2. 您可能在 11g 上并让 Oracle 将 PGA 和 SGA 分配到一个池中
    3. 您可能正在使用 PGA_AGGREGATE_TARGET(让 Oracle 根据会话数猜测 PGA 设置)或自己设置内存限制。
    4. 您可能有一些需要大量内存的进程来咀嚼东西

    PS。 2GB 是否意味着您在 Windows 上?

    【讨论】:

    • 这是一个windows盒子。 2GB RAM 是总 RAM avbl。我们在 Oracle 10g R2 上。最大 SGA 大小为 652 MB 聚合 PGA 目标为 24 MB 当前分配的 PGA 为 72 MB 曾经分配的最大 PGA 为 247 MB​​
    【解决方案4】:

    您的所有连接都使用同一个用户帐户吗?如果是这样,您可能需要检查您是否对该用户帐户设置了每用户会话限制。

    另外,您是否获得了超过 40 个连接的许可? (检查您的参数文件中是否设置了 LICENSE_MAX_SESSION)

    【讨论】:

    • 参数 license_max_sessions 设置为零。 session = 170 sessions_max_open_files = 10 shared_server_sessions - 未设置为任何值。
    【解决方案5】:

    会话池是客户端驱动的。它不知道(或控制)数据库将允许多少会话。

    您应该查看服务器以确定允许的实际连接数,并根据服务器允许的连接设置会话池数。

    您的连接池不应使用所有允许的连接。这将允许其他 ID 连接。如果您有一个使用 USER_1 的应用程序,您可以将连接池设置为使用一定数量的允许连接,但要留出足够的连接供……哦,比如说 DBA 登录。

    -- 编辑--
    在您的连接池达到最大值之前,进程可能已经耗尽。

    SQL> show parameter processes
    
    NAME                                 TYPE        VALUE
    --------------------------------------------------------------------------------
    processes                            integer     40
    

    这是允许的总进程数 现在看看有多少已经被使用了——其中很多是你永远不会想到的后台 proc。

    SQL> select count(*) from v$process;
    

    【讨论】:

    • 我认为他已经设置好了 - 最大池大小为 150,最多 160 个会话,他应该有大约 10 个剩余用于其他用户连接。
    • 我将最大池大小减小到 100。但仍然出现此问题。
    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2018-09-09
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多