【问题标题】:Sharing Hibernate on multiple Tomcat instances在多个 Tomcat 实例上共享 Hibernate
【发布时间】:2011-04-05 21:49:37
【问题描述】:

我有 4 个 Web 应用程序,它们具有对 Hibernate 实现的共同引用,但它们在不同的 Tomcat 实例上运行。因此,例如,在 Hibernate 中配置的最小大小为 3c3p0)的连接池将导致 12 个连接打开(每个实例 3 个) 当所有项目都在运行时。

我想与实例“共享”Hibernate 实现(因此始终打开 3 个连接而不是 12 个),我想知道实现它的最佳解决方案。

有什么建议吗?

谢谢

【问题讨论】:

  • “休眠实现”是什么意思?
  • 所有 4 个 Web 项目都引用了另一个实现 Hibernate 的项目(DAO 类、db-entities 等)。所以当 web 项目部署在不同的 Tomcat 实例上时,Hibernate 会被初始化 4 次。

标签: java hibernate tomcat multiple-instances


【解决方案1】:

我想与实例“共享”Hibernate 实现(因此始终打开 3 个连接而不是 12 个),我想知道实现它的最佳解决方案。有什么建议吗?

这不是一个好主意。简而言之,连接池的大小应包含足够的连接来服务传入的并发请求,而无需等待连接变为可用。对于 4 个应用程序,您很可能需要 3 个以上的连接。你的逻辑有问题(或不清楚)。

因此,我的建议是分配足够的资源并适当地调整线程池和连接池的大小,以服务于每个应用程序应该处理的并发请求,并且不会耗尽池。

另见

【讨论】:

  • 每个应用程序都有自己的数据库消耗率。例如,假设 app1、app2、app3 和 app4 在池中需要 1 分钟的连接(打开的连接总数:4)。突然 app4 增加了 db 上的工作,所以我想将 db 上的活动最小连接数从 4 增加到 6(app4 再增加 2 个)。因为 Hibernate 被实例化了 4 次并且每个应用程序的配置都相同,所以我无法将 app4 调整为特定设置:如果我将最小连接增加到 3,那么我将在 db 上拥有 12 个活动连接而不是 6 个。
  • 解决方案可能是将 Hibernate 实现导出到单独的实例上,然后通过远程处理或类似的方式访问 DAO。我只是想知道哪个可能是最好的解决方案。
  • @Marco 我不明白为什么你不能单独配置每个应用程序。只需覆盖每个应用程序的设置,例如通过在类路径上提供hibernate.properties 文件。没有技术原因阻止您这样做。因此,您要么没有说出所有内容,要么正在创建一个不存在的约束。就个人而言,我更喜欢在同一个 VM 中运行 Hibernate,我会坚持当前配置,但提供特定于应用程序的设置。
  • 你说得对,我一直坚信要让它独立,我为此苦苦思考,以至于我看不到明显的解决方案。谢谢!
【解决方案2】:

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

【讨论】:

  • 这将删除多个 SessionFactory 实例(但会为远程处理引入额外的开销),但不会降低为来自 4 个客户端应用程序的并发请求提供服务所需的连接数(所有最大)。
  • 没错,有一些远程处理开销,但这是一种为多个前端共享一个 Hibernate 实例的方法。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2020-12-05
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多