ATG RepositoryItem getPropertyValue, без кеша, без транзакции
Если у меня есть элемент хранилища ATG Nucleus, который не может быть кэширован (простой кэш ATG/Nucleus отключен), и я не участвую в транзакции, следующий результат приводит к двум запросам к базе данных.
Следующий код приводит к запросу базы данных для каждого свойства. repositoryItem.getPropertyValue ("Columna"); repositoryItem.getPropertyValue("columnB");
Если отладка для объекта пользователя включена, вы будете видеть следующие операторы журнала при каждом вызове:
repositoryItem.getPropertyValue ("Columna"); Свойство DEBUG loadingPropertyFromDatabase(user:ID_1.columnA, column_a_value) не может быть кэшировано для этой транзакции отключено кэширование DEBUG Свойство loadingPropertyFromDatabase(user:ID_1.columnB, column_b_value) не кэшировано для этой транзакции отключено кэширование DEBUG getPropertyValue(пользователь: ID_1.umnumn) > "column_a_value" (значение из базы данных)
repositoryItem.getPropertyValue ("columnB"); Свойство DEBUG loadingPropertyFromDatabase(user:ID_1.columnA, column_a_value) не может быть кэшировано для этой транзакции отключено кэширование DEBUG Свойство loadPropertyFromDatabase (user: ID_1.columnB, column_b_value) не кэшировано для этой транзакции отключено кэширование DEBUG getPropertyValue(пользователь: ID_1.column) > "column_b_value" (значение из базы данных)
Мы не можем включить кэширование из-за того, как объект доступен / обновляется другими системами.
Я также не хочу создавать транзакцию для запроса объекта только для чтения.
Если бы я использовал Hibernate, сеанс Hibernate сохранял бы состояние внутри сеанса, даже если бы я не был в транзакции. Это не похоже на случай с ATG/Nucleus. Есть ли способ, которым я могу получить этот тип поведения или кэш уровня потока?
Просматривая документацию и просматривая код с помощью отладчика (что трудно без исходного кода), мне не повезло найти обходной путь.
Спасибо!
1 ответ
Вы должны обернуть getPropertyValue
вызовы с транзакцией, которые сохранят результаты запросов базы данных во временный кэш транзакций. Это предотвратит возврат хранилища в базу данных для каждого getPropertyValue
вызов.
Вы также хотите убедиться, что все свойства, к которым вы обращаетесь, входят в одну группу свойств (как описано здесь). Первая загрузка элемента из базы данных будет включать свойства в той же группе, что и свойство ID. Это в сочетании с кэшем транзакций значительно сократит количество запросов к базе данных.
Я также не хочу создавать транзакцию для запроса объекта только для чтения.
Я не понимаю, почему вы не хотите явно разграничить транзакцию. каждый getPropertyValue
Вызов автоматически создаст (и завершит) транзакцию, если ее еще нет. Таким образом, в вашем примере у вас было бы 2 транзакции, неявно созданные для вас. Почему бы просто не создать 1 транзакцию явно?