Grails的交易有多贵?

时间:2014-12-09 23:44:09

标签: performance grails groovy transactions

我正在查看Grails应用程序的性能问题,建议是从服务中删除事务。

有没有办法可以衡量服务的变化?

是否有一个地方有关于交易成本的数据? [时间和资源方面]

1 个答案:

答案 0 :(得分:2)

如果有人告诉您,从您的服务中删除交易是帮助提高绩效的好方法,那么您不应该听取该人未来的任何建议。您应该查看在事务中花费的时间并确定实际开销是多少,并查找在事务中运行但不需要修复那些非事务性的方法和整个服务。但删除所有交易将是不负责任的。

您会故意在方法返回值中添加偶发错误并使数据不一致,当您拥有大量流量时,这会变得更糟。一个稍快但有缺陷的应用程序或网站不会受欢迎,如果这对性能没有帮助(或者说不多),那么你仍然需要做到找到瓶颈,缺少索引等的真正工作。那些真正导致问题的事情。

我会删除所有控制器的所有@Transactional注释和数据库写入;不是出于性能原因,而是为了使应用程序层保持合理且不受不相关代码和逻辑的污染。

如果您发现一个或多个不需要事务的服务方法,请切换到根据需要注释每个事务方法,但省略类范围的注释,因此未注释的方法不会继承任何事务并且不具有事务性。您还可以将这些方法移至非事务性服务。

请注意,如果没有@Transactional注释且有transactional属性禁用该功能,则服务只是非事务性的:

static transactional = false

如果您没有该属性并且没有注释,它看起来就没问题,但如果没有指定,transactional默认为true。

还有其他东西可以帮助很多(并且已经有)。 dataSource bean实际上是代理的代理 - 一个代理返回来自池的连接,该连接由打开的Hibernate会话或事务使用,因此您可以查看未提交的数据并执行查询和更新相同的连接。另一个与你的问题更相关:org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy已经在Spring中存在多年但仅在2.3中用于Grails。它有助于启动或参与事务但不执行数据库工作的方法。对于单个方法调用的情况,不必要地启动并提交一个空的'事务,涉及的开销包括获取池连接,然后调用set autocommit false,设置事务隔离级别等。所有这些都是小成本,但它们相加。该类通过为您提供缓存这些方法调用的代理连接,并且仅在实际运行查询时获取实际连接并在其上调用这些方法来工作。如果没有查询,并且唯一的调用是那些与交易相关的设置方法,那么基本上没有任何成本。你不应该依赖这个,并且应该故意使用@Transactional注释,但是如果你错过了一个,这个池代理将有助于避免不必要的工作。