2010-08-03 27 views
2

我有两个grails(1.2.1)应用程序部署在两个不同的应用程序服务器。一个应用程序包含主站点(视图,控制器,域等),另一个应用程序具有执行核心和后端处理的Quartz插件。这两个应用程序都共享域类和相同的DataSource配置。这意味着这两个应用程序正在访问相同的数据库和表。使用相同数据库和表的两个Grails应用程序是否有特殊配置?

我的问题是:在查询数据库时是否存在任何损失?

如果Quartz工作应用程序正在运行,我只是注意到主站点应用程序的一些缓慢。虽然没有明确的证据或统计数据。每个应用程序上的hibernate组件能否在某些事件中正确处理并发和事务?还是我需要在每个应用程序的grails-app/conf中配置一些东西?现在,我没有添加额外的配置。

谢谢。

回答

3

我能想到的主要问题是二级缓存问题。如果两个应用程序尝试缓存数据,则当缓存由于其他应用程序更改而与数据库不同步时,它可能会导致StaleObjectException和类似情况。二级缓存默认是禁用的,尽管如此,您可能没有问题。

这还取决于您是使用默认提供的乐观锁定还是显式锁定您的域类的lock()方法。乐观锁定不应该导致速度减慢(但如果其他应用已更新该行,则可能会导致保存异常)。

+0

感谢您的信息。我认为第二级缓存在1.2.1中启用,是的,我在日志中看到org.hibernate.StaleObjectStateException。那么我需要关掉那面旗帜?如果是这种情况,会有什么坏处?对不起,在Grails框架内部仍然不太熟悉。 – firnnauriel 2010-08-03 11:42:03

+0

您可以在DataSource.groovy中完全关闭它,也可以将代码添加到应用程序以处理保存时的异常并执行刷新(),然后再次更新并重试保存。 尽管您已经明确启用了每个类的缓存,但实际上并未使用缓存(即使已启用缓存)。 – leebutts 2010-08-03 20:56:07

+0

过时的对象异常将来自乐观锁定(通过域类上的版本列完成)。 您可以通过向每个域类的映射闭包添加“版本false”来关闭此功能。风险是您可能会丢失每个系统相互覆盖的更新。您需要确定风险是否足够小以避免处理StaleObjectExceptions的额外工作。 – leebutts 2010-08-03 20:56:26

0

您是否考虑过一种架构,其中一个应用程序掌握您的域类,另一个通过消息或Web服务调用与其集成?这样做可以避免与应用程序中的重复相关的一些问题。

相关问题