如果我的ATG Nucleus存储库项目不可缓存(禁用ATG / Nucleus简单缓存)并且我不在事务中,则以下结果会导致对数据库的两次查询。
以下代码会为每个属性生成一个db查询。 repositoryItem.getPropertyValue( “columnA”); repositoryItem.getPropertyValue( “columnB”);
如果启用了用户实体的调试,则每次调用时都会看到以下日志语句:
repositoryItem.getPropertyValue( “columnA”); DEBUG loadingPropertyFromDatabase(用户:ID_1.columnA,column_a_value)属性不能为此事务禁用缓存缓存 DEBUG loadingPropertyFromDatabase(用户:ID_1.columnB,column_b_value)属性不能为此事务禁用缓存缓存 DEBUG getPropertyValue(user:ID_1.columnA) - > “column_a_value”(来自数据库的值)
repositoryItem.getPropertyValue( “columnB”); DEBUG loadingPropertyFromDatabase(用户:ID_1.columnA,column_a_value)属性不能为此事务禁用缓存缓存 DEBUG loadingPropertyFromDatabase(用户:ID_1.columnB,column_b_value)属性不能为此事务禁用缓存缓存 DEBUG getPropertyValue(user:ID_1.columnB) - > “column_b_value”(来自数据库的值)
由于对象如何被其他系统访问/更新,我们无法启用缓存。
我也不想为实体的只读查询创建事务。
如果我使用Hibernate,即使我不在事务中,Hibernate会话也会在会话中保持状态。 ATG / Nucleus似乎并非如此。有什么方法可以获得这种类型的行为或线程级缓存?
在查看文档并通过调试器浏览代码时(这很难用来源),我找不到任何运气。
谢谢!
答案 0 :(得分:2)
您需要使用事务包装getPropertyValue
调用,该事务将数据库查询的结果保存到临时事务高速缓存中。这将阻止存储库在每次getPropertyValue
调用时返回数据库。
您还希望确保您访问的所有属性都属于同一属性组(如here所述)。数据库中项目的第一次加载将引入与ID属性相同的组中的属性。这与事务缓存相结合将显着减少数据库查询的数量。
我也不想为只读查询创建事务 实体。
我不明白为什么你不想明确界定交易。如果某个交易已经存在,则每次getPropertyValue
来电都会自动创建(并结束)交易。因此,在您的示例中,您将隐式创建2个事务。为什么不明确地创建1个事务?