两个不同的Java应用程序共享同一个数据库

时间:2011-04-16 19:27:49

标签: java hibernate integration

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

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

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

仅使用相同的数据库进行集成是否有益?这可能会导致同时从两个应用程序访问数据库的问题。或者可以在Hibernate级别上进行集成,因此两个应用程序都可以使用相同的Hibernate会话吗?但是,来自一个JVM实例的应用程序是否可以从另一个JVM实例访问该对象?

对于有关此事的任何建议,我将不胜感激。

更新

用户(来自网络应用程序的界面)将输入要解析的抓取工具的网址。抓取工具应用程序只会读取包含Web应用程序填充的URL的表格。反之亦然,爬虫处理的数据只会在用户界面上显示。所以,我想我不应该担心任何类型的锁定,对吧?

谢谢, 尼古拉

2 个答案:

答案 0 :(得分:1)

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

抓取工具运行的频率是多少?或者是连续运行的进程?您可能需要根据您的要求考虑频率。

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

网络应用应该使用连接池,批量应用可以使用DBCPC3P0。我不确定您是否通过尝试在此方案中共享数据库会话而获得了很多好处。

通过这种方式,您可以在两个应用程序之间进行集成,同时不会在彼此等待其他处理过程中减慢速度。

HTH!

答案 1 :(得分:1)

你是对的,在你的情况下将应用程序拆分为两个可能是合理的。

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

  • 您无法在Hibernate或任何其他任何一个应用程序中可修改的缓存可变对象中进行缓存。乐观锁定应该适用于两个休眠应用程序。我没有看到任何其他问题。

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