【问题标题】:How many session will create using single pool?使用单个池将创建多少个会话?
【发布时间】:2021-02-03 11:49:33
【问题描述】:

我正在使用Knex 版本 0.21.15 npm。我的池化参数是pool{min: 3 , max:300}。 Oracle 是我的数据库服务器。

  1. pool 这是池数还是会话数?
  2. 如果是池,使用单个池可以创建多少个会话?
  3. 如果我使用 knex 连接运行一个非事务查询 10 次,将创建多少个会话?
  4. 创建的会话何时会从 oracle 会话中清除?
  5. 是否有任何参数可用于从 oracle 中删除空闲会话?

如果有的话请给我建议。

【问题讨论】:

    标签: node.js oracle connection-pooling knex.js


    【解决方案1】:

    警告:pool.max 值为 300 太大了。您真的不希望运行 Oracle 服务器的数据库管理员不信任您:这可以使您的工作生活更加困难。如此大的最大池大小可能会使 Oracle 服务器瘫痪。

    这是一个悖论:通常您可以通过减少池大小从数据库应用程序中获得更好的吞吐量。那是因为许多并发查询会阻塞数据库系统。

    这里的pool 对象控制池中一次可以有多少个连接。每个连接都是所谓的串行可重用资源。也就是说,当你的 nodejs 程序的某些部分需要运行一个查询或一系列查询时,它会从池中获取一个连接。如果池中没有可用的连接,则 knex 中的池内容会打开一个新的。

    如果打开的连接数已经是 pool.max 值,池的东西会让你的 nodejs 程序的那部分等待,直到程序的其他部分完成使用池中的连接。

    当你的 nodejs 程序完成查询后,它会将连接释放回池中,以便在程序的其他部分需要时重用。

    这几乎是荒谬的复杂。何苦?因为打开连接的成本很高,而重用它们的成本要低得多。

    现在回答你的问题:

    池 这是池计数还是会话计数?

    这是对池中一次打开的连接(会话)计数的一对限制(最小值/最大值)。

    如果是pool,一个pool可以创建多少个session?

    直到 pool.max 值。

    如果我使用 knex 连接运行一个非事务查询 10 次,将创建多少个会话?

    这取决于并发性。如果在第一个查询完成之前的第十个查询,您可以使用池中的十个连接。但是您很可能会使用更少的数量。

    什么时候创建的会话会从 oracle 会话中清除?

    如前所述,池保持打开 pool.max 连接。这就是为什么 300 太多了。

    是否有任何参数可用于从 oracle 中删除空闲会话?

    此操作称为从池中“驱逐”连接。 knex 不支持这个。 Oracle 本身可能会在超时后丢弃空闲连接。询问您的 DBA。

    与此同时,使用 knex 默认值 pool: {min: 2, max: 10},除非您真正了解池化和应用程序所需的并发性。 max:300 仅在非常特殊的情况下才合理。

    【讨论】:

    • 感谢您的回复。我的应用程序有 3000 个用户,我怀疑有 300 多个并发用户,需要运行更多并行查询以便我设置 max pool : 300
    • 将池大小设置得如此之高是一个很大的错误,即使你有那么多并发用户。严重地。您希望序列化他们对数据库的访问,而不是并行运行他们的所有查询。
    • 我获取连接并存储在内存中,当需要连接时从内存中获取连接对象并执行查询。
    • 查询执行很严重,但有更多用户。更多查询需要运行单个连接。
    • 我减少了 mij 和最大池大小,有时我收到以下错误消息。游泳池可能已满。
    猜你喜欢
    • 2023-02-11
    • 2014-11-18
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    相关资源
    最近更新 更多