在多个Tomcat实例上共享Hibernate

5
我有4个Web应用程序,它们都共同引用了Hibernate实现,但在不同的Tomcat实例上运行。例如,在Hibernate中配置一个最小大小为3(使用c3p0),将导致当所有项目都在运行时打开12个连接(每个实例3个)。
我想要将Hibernate实现与实例“共享”(始终保持3个连接而不是12个),并且我想知道实现这一目标的最佳解决方案。
有什么提示吗?
谢谢

“Hibernate实现”是什么意思? - Bozho
所有4个Web项目都引用了另一个实现Hibernate(DAO类、数据库实体等)的项目。因此,当这些Web项目在不同的Tomcat实例上部署时,Hibernate被初始化了4次。 - Mark
3个回答

5
我想要将Hibernate实现与实例“共享”,以便始终保持3个连接打开而不是12个,我正在思考实现此目标的最佳解决方案。有什么提示吗?
这不是一个好主意。简而言之,连接池的大小应该足够大,以包含足够的连接来为传入的并发请求提供服务,而无需等待可用的连接。对于4个应用程序,您很可能需要更多的连接。您的逻辑存在问题(或不清楚)。
因此,我的建议是分配足够的资源,并适当地调整线程池和连接池的大小,以处理每个应用程序应该处理的并发请求,而不会耗尽池。
另请参阅:
- 解决常见的Java EE性能问题

每个应用程序都有自己的数据库消耗率。例如,假设app1、app2、app3和app4在池中需要1分钟的连接(总共打开的连接数为4)。突然间,app4增加了对数据库的工作量,因此我想将数据库上的活动最小连接数从4增加到6(为app4增加2个连接)。由于Hibernate被实例化了4次,并且每个应用程序的配置都相同,我无法调整app4到特定的设置:如果我将最小连接数增加到3,则数据库上将有12个活动连接,而不是6个。 - Mark
解决方法可能是将Hibernate实现导出到单独的实例上,然后通过远程访问或类似方法访问DAO。我只是想知道哪种方法可能是最好的解决方案。 - Mark
@Marco 我不明白为什么你不能单独配置每个应用程序。只需针对每个应用程序覆盖设置,例如通过在类路径上提供hibernate.properties文件。没有技术原因阻止您这样做。因此,要么您没有说出一切,要么您正在创建不存在的约束。就我个人而言,我更喜欢在同一VM中运行Hibernate,并将提供应用程序特定的设置保持当前配置不变。 - Pascal Thivent
你说得对,我一直固执地想让它独立运行,为此费尽心思,结果却没能看到显而易见的解决方案。谢谢! - Mark

1
一种方法是创建一个额外的后端服务,该服务运行Hibernate,并通过Web服务连接到前端服务。这样就会有一个Hibernate实例。

这将消除多个 SessionFactory 实例(但引入远程调用的额外开销),但不会降低为 4 个客户端应用程序(所有最大值之和)提供并发请求所需的连接数。 - Pascal Thivent
没错,这里有一些远程开销,但这是为多个前端共享一个Hibernate实例的一种方式。 - Timo Westkämper

0

你做不到。每个Tomcat实例都在自己的JVM中运行,因此你不能在它们之间共享对象或类。

为什么你不喜欢12个数据库连接?现代数据库系统能够处理数百万个连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接