Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate. Отключить кэширование. / 6 сообщений из 6, страница 1 из 1
12.10.2012, 12:33:21
    #37995383
ochoba
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate. Отключить кэширование.
Добрый день.
У меня проблемка с хибернейтом. Выполняю запрос один раз, возвращает верное значение. Меняю вручную значение в базе (Оракл11), снова выполняю запрос, он возвращает то же значение, что и в первый раз.
Я так понимаю, что хибернейт закэшировал это значение. Вопрос, как мне обойти эту проблему? Я рассчитывал, что session.flush() синхронизирует текущие значения объектов с базой, но похоже, я что-то не так понимаю, и это не помогает.
Я новичок, и сделать мне это нужно единожды, поэтому раскуривать мануалы - не лучший выбор.
Может тут есть какое-то простое решение?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
public class ServiceImpl
{
public static String get(final String param1, final String param2, final String param3)
	{
		try
		{
			String value = HibernateExecutor.getInstance().execute(new HibernateAction<String>()
			{
				public String run(Session session) throws Exception
				{
					//session.setCacheMode(CacheMode.IGNORE);
					session.flush();

					Query query = session.getNamedQuery("queryGet");
					query.setParameter("par1", param1);
					query.setParameter("par2", param2);
					query.setParameter("par3", param3);
					String result = (String) query.uniqueResult();
					
					return result;
				}
			});

			return value;
		
	}
}



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<hibernate-mapping>

    <class name="ServiceImpl" table="TABLE1" batch-size="500">

        <id name="synchKey" type="string" column="id"/>

	     <property name="par1" type="string" column="col1"/>
             <property name="par2" type="string" column="col2" />
	     <property name="par4" type="string" column="col3"/>
	     <property name="value" type="string" column="col4"/>

    </class>

	<query name="queryGet">
        select value from ServiceImpl as table1
            where table1.par1=:par1 and table1.par2=:par2 and table1.par3=:par3
    </query>

</hibernate-mapping>
...
Рейтинг: 0 / 0
12.10.2012, 12:47:51
    #37995412
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate. Отключить кэширование.
ochoba,

Код: xml
1.
2.
<property name="hibernate.cache.use_second_level_cache" value="false" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
...
Рейтинг: 0 / 0
12.10.2012, 13:11:01
    #37995473
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate. Отключить кэширование.
Кэш второго уровня и кэш запросов отключены по- умолчанию; попробуйте

Код: java
1.
2.
3.
...
session.clear()
...
...
Рейтинг: 0 / 0
12.10.2012, 13:28:20
    #37995518
ochoba
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate. Отключить кэширование.
ivanov-void,

Порылся в настройках, кэш запросов включен
Код: xml
1.
<property name="hibernate.cache.use_query_cache">true</property>


Но, я вычитал, что для кэширования нужно еще устанавливать
Код: java
1.
query.setCacheable(true);

у меня сacheable false, т.е., по идее, он не должен кэшироваться.

Еще такой момент, приложение достаточно большое, и я хочу сделать просто костыль в одном месте, поэтому менять глобальные настройки не хочется.

Попробую
Код: java
1.
session.clear()

как вы предложили.
...
Рейтинг: 0 / 0
12.10.2012, 13:32:35
    #37995529
ochoba
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate. Отключить кэширование.
Еще видел пример
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Query query = session.createQuery("from SharedDoc doc where doc.name = :name");

SharedDoc persistedDoc = (SharedDoc) query.setParameter("name", "first").uniqueResult();
System.out.println(persistedDoc.getName());
user1.setDoc(persistedDoc);

persistedDoc = (SharedDoc) query.setParameter("name", "first").uniqueResult();
System.out.println(persistedDoc.getName());
user2.setDoc(persistedDoc);


Результаты такого рода запросов не сохраняются ни кешом первого, ни второго уровня. Это как раз то место, где можно использовать кеш запросов. Он тоже по умолчанию отключен.
Я так понимаю, это из-за того, что запрос создается каждый раз заново? Попробую сейчас сделать так.
...
Рейтинг: 0 / 0
12.10.2012, 14:47:44
    #37995727
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate. Отключить кэширование.
ochoba,
чем меняли в базе? Коммит потом точно сделали?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate. Отключить кэширование. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]