java 更好的连接池

connection pooling in java better way

我正在处理数据库连接池。我可以看到使用应用程序服务器端创建连接池的各种选项,然后查看 JNDI、休眠连接池,我可以在配置文件中设置属性。

我有 2 个问题。

  1. 我设置的属性如下

    hibernate.c3p0.max_size=20  (Max number of database connections to open)
    

    如果有 100 个用户访问我的网站,而我只指定了 20 个连接对象,会发生什么情况。剩下的 80 个用户是否会等到 20 个用户完成他们的交易,或者剩下的 80 个用户如何连接到应用程序?

  2. 使用 hibernate 配置或通过应用程序服务器端的连接池哪个更好?

提前致谢。

创建连接时描述的连接创建部分。它描述了多个 Context 实例如何共享同一个连接。 在这种类型的共享中,来自不同 Context 实例的操作被多路复用到同一个连接上。 您可以通过决定何时创建新的初始上下文以及何时从现有上下文实例获取派生上下文实例来控制共享程度。 这种连接共享方式可以满足大部分应用。

https://docs.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html

连接池是在数据源中实现的,在这两种情况下,Hibernate 都将使用数据源。 您可以在休眠配置中指定和配置数据源 您可以在应用程序中配置数据源。服务器,并在休眠配置中指定相应的 JNDI 名称。 在这种情况下,您使用应用程序附带的数据源实现。服务器。

举个例子,我们以每秒 100 笔交易为例。假设每个前端(浏览器)tx 需要 0.5 秒来 完成,在 0.5 秒中,有 0.25 秒花费在数据库中。 因此,您需要 0.5 * 100 或 100 个连接在 thead 池中,0.25 * 100 = 25 个连接在数据库连接池中。

为了安全起见,我会将最大线程池大小设置为至少比您预期的大 25%,以允许出现负载峰值。 最小值可以是最大值的一小部分,但权衡是某些用户可能需要更长的时间,因为必须建立新连接 创建。在这种情况下,50 - 100 个连接对于数据库来说并不多,因此这可能是一个很好的起始数字。

请注意,要计算出您的平均事务响应时间以及平均数据库查询时间, 您将不得不进行性能测试,因为您的负载时间可能不会是您在单个用户身上看到的时间。

当您需要同时限制应用程序中的线程数 运行 时,线程池很有用。 让我们假设您的数据库最多可以支持 25 个连接,那么可以直接将连接池最大属性配置为 25。但是这个设置将如何影响线程池设置?将应用程序服务器线程池配置为最多 50 个。在这种情况下,应用程序服务器将允许同时处理 50 个请求,但数据库只有 25 个连接。因此只有 25 个线程将获得连接,另外 25 个线程将争夺数据库连接,因此连接将在线程之间频繁切换,这将降低整体应用程序性能。 假设我们将线程池最大设置与连接池最大设置相同,均为 50。应用程序服务器将允许同时处理 50 个线程,其余线程将处于等待状态。所有 50 个线程将立即获得数据库连接,因此将被快速处理。 上面的例子假设每个线程将使用一个数据库连接(可能是多个连接但顺序);如果您的应用程序每个线程并行使用两个数据库连接,则将线程池最大值设置配置为连接池最大值的一半。 最后,线程池大小设置过大会导致性能问题,因为如果并发线程过多,任务切换开销会成为严重的瓶颈。