【问题标题】:Two different Java applications sharing the same database两个不同的 Java 应用程序共享同一个数据库
【发布时间】:2011-08-07 00:51:33
【问题描述】:

在我的 Web 应用程序中,我有一部分需要不断地抓取 Web、处理这些数据并将其呈现给用户。因此,我想知道将其拆分为两个独立的应用程序是否是一种好方法,其中一个将进行爬取、数据处理并将数据存储在数据库中。另一个应用程序将是一个 Web 应用程序(安装在某个 Web 服务器上),它将向用户呈现来自数据库的数据并允许他与数据进行某种交互。

我认为我需要这种拆分的原因是因为如果我对我的网络应用程序进行某些更改(例如添加新功能、更改界面等),我不希望抓取被中断。

我的应用程序堆栈是 Tapestry(Web 层)、Spring、Hibernate(通过 MySQL)和我自己的独立于其他爬虫的实现。

只使用同一个数据库就可以完成集成吗?这可能会导致同时从两个应用程序访问数据库时出现问题。或者可以在 Hibernate 级别上完成集成,以便两个应用程序可以使用相同的 Hibernate 会话?但是一个 JVM 实例中的应用可以访问另一个 JVM 实例中的对象吗?

如果您对此事提出任何建议,我将不胜感激。

更新

用户(来自网络应用程序的界面)将输入 URL 以供爬虫解析。爬虫应用程序只会读取带有 Web 应用程序填充的 URL 的表格。反之亦然,爬虫处理的数据只会呈现在用户界面上。所以,我认为我不应该关心任何类型的锁定,对吧?

谢谢, 尼古拉

【问题讨论】:

    标签: java hibernate integration


    【解决方案1】:

    我肯定会像您计划的那样将它们分开。与请求驱动的 Web 应用程序相比,Web 爬行更像是一个“批处理”过程。 Web 抓取应用程序将在其自己的 JVM 中运行,而您的 Web 应用程序将在 servlet/Java EE 容器中运行。

    爬虫多久运行一次,还是一个持续运行的进程?您可能需要根据您的要求考虑频率。

    网络应用程序中的用户是否会更新爬虫将数据发布到的相同表?在这种情况下,您需要采取预防措施,否则可能会出现潜在的死锁。如果您希望您的 Web 应用程序根据表中的新插入自动刷新数据,那么您可以创建一个消息驱动的 bean(使用 JMS)以从爬虫应用程序异步通知 Web 应用程序。当新的数据插入消息到达时,您可以在页面上提交表单或使用 ajax 更新页面本身的数据。

    Web 应用程序应使用连接池,而批处理应用程序可以使用 DBCPC3P0。我不确定您在这种情况下尝试共享数据库会话会获得多少好处。

    这样您就可以在两个应用程序之间进行集成,同时不会减慢彼此等待其他应用程序处理的速度。

    HTH!

    【讨论】:

    • 非常感谢您的回复!用户将插入页面的 URL 以供爬虫爬取,但爬虫应用程序只会读取该表,而不以任何方式更新它。谢谢!
    【解决方案2】:

    您是对的,在您的情况下,将应用程序一分为二可能是合理的。

    分成两个应用程序的缺点 -

    • 您不能在 Hibernate 或任何其他缓存的可变对象中缓存,这些对象可从其中任何一个应用程序中修改。乐观锁定应该适用于两个休眠应用程序。我没有发现任何其他问题。

    您已在代码中指定的优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2019-02-23
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      相关资源
      最近更新 更多