警告: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 仅在非常特殊的情况下才合理。