我正在处理数据库连接池。我可以看到使用Application服务器端创建连接池的各种选项,然后查看JNDI,hibernate连接池,我可以在配置文件中设置属性。
我有两个问题。
我已将属性设置如下
hibernate.c3p0.max_size=20 (Max number of database connections to open)
如果有100个用户访问我的网站并且我只指定了20个连接对象,会发生什么。剩下的80个用户是否会等到20个用户完成他们的交易,或者剩下80个用户如何连接到应用程序?
这是使用hibernate配置或应用服务器端连接池的更好方法吗?
提前致谢。
答案 0 :(得分:0)
创建连接时描述的“连接创建”部分。它描述了几个Context实例如何共享同一个连接。 在这种类型的共享中,来自不同Context实例的操作被复用到同一连接上。 您可以通过决定何时创建新的初始上下文以及何时从现有的Context实例获取派生的Context实例来控制共享的程度。 这种类型的连接共享满足大多数应用程序。
https://docs.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html
连接池在DataSource中实现,在这两种情况下,Hibernate都将使用数据源。 您可以直接在hibernate配置中指定和配置数据源 您可以在应用程序中配置数据源。服务器,并在休眠配置中指定相应的JNDI名称。 在这种情况下,您将使用应用程序附带的数据源实现。服务器
对于coonetcion的数量,举一个例子,让我们每秒进行100次交易。假设每个前端(浏览器)tx需要0.5秒 完成和0.5秒,0.25在数据库中花费。 因此,您需要在thead池中使用0.5 * 100或100个连接,并在数据库连接池中使用0.25 * 100 = 25个连接。
为了安全起见,我会将最大线程池大小设置为比您预期允许加载峰值大至少25%。 最小值可以是最大值的一小部分,但权衡是某些用户可能需要更长时间,因为新连接必须是 创建。在这种情况下,对于数据库而言,50-100个连接并不是那么多,因此这可能是一个很好的起始数字。
注意,要确定平均事务响应时间是多少,以及平均数据库查询时间, 您将不得不进行性能测试,因为您在加载时的时间可能不会是您在单个用户看到的时间。
当您需要同时限制应用程序中运行的线程数时,线程池非常有用。 假设您的数据库最多可以支持25个连接,那么可以直接将连接池最大属性配置为25.但是此设置如何影响线程池设置?将应用程序服务器线程池配置为最多50个。在此方案中,应用程序服务器将允许同时处理50个请求,但数据库只有25个连接。因此,只有25个线程将获得连接,另外25个线程将争取获得数据库连接,因此连接将在线程之间频繁切换,这将降低整体应用程序性能。 假设我们将线程池最大设置设置为与连接池最大设置50相同。应用程序服务器将允许同时处理50个线程,其余线程将处于等待状态。所有50个线程将立即获得数据库连接,因此它将被快速处理。 上面的例子假设每个线程将使用一个数据库连接(可能是多个连接但是顺序连接);如果您的应用程序每个线程并行使用两个数据库连接,则将线程池最大设置配置为连接池最大值的一半。 最后,将线程池大小设置得太大会导致性能问题,因为如果并发线程太多,任务切换开销就成了一个严重的瓶颈。