Cache Hibernate

toda vez que esse método for chamado, vai ser retornada a última versão do banco de dados, mesmo sem o refresh

Como resolver isso?

faça o seguinte:

  • mude uma filial em um sistema
  • liste as filiais no outro sistema (usando esse método!)

e vice-versa.

Isso funciona?

outra coisa: qdo vc muda as filiais em um sistema, vc faz isso dentro de uma transação? ou seja, está indo de verdade pro banco?

[code]public void edit(Filial filial) {
Transaction tx = session.beginTransaction();
session.update(filial);
tx.commit();
}

@SuppressWarnings("unchecked")
public List<Filial> listar() {
	return this.session.createCriteria(Filial.class).list();
}[/code]

Bom, está ai, updating de uma filial… Só não entendi ainda como fazer a parte do refresh! kkkkk
LEIGO! kkk

esquece o refresh, não precisa dele.

se as duas aplicação estão usando o mesmo banco mesmo, deveria funcionar

Bom fiz o teste… Adicionei localmente dois registros.
Fui no MySQL e dei select direto na base, estão inseridos.
Mas no servidor remoto não consta os dois registros…
Adicionei um novo registro no servidor remoto… então ele leu os 2 registros.

Portanto, está em cache, e preciso fazer com que as informações fiquem sincronizadas…
Pensei em Flush

session.flush() o que acha?

não é cache…

pode ser cache da página, não?

o servidor remoto está com a mesma aplicação?

exatamente a mesma aplicação, não é cash pois eu entrei na página pela primeira vez… e não reiniciei o tomcat! ou seja, continua com as mesmas informações, entretanto quando ele faz o commit, então ele carrega os dados.

bom, se vc não configurou o cache de segundo nível, a única explicação é você estar com uma mesma session aberta pra várias requisições, é isso?

Claro, isso pode ser sim… Bom fiz o seguinte:


import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

@Component
@ApplicationScoped
public class CreateSessionFactory implements ComponentFactory<SessionFactory> {

	private SessionFactory factory;

	@PostConstruct
	public void abre() {
		AnnotationConfiguration configuration = new AnnotationConfiguration();
		configuration.configure();
		this.factory = configuration.buildSessionFactory();
	}

	public SessionFactory getInstance() {
		return factory;
	}

	@PreDestroy
	public void fecha() {
		this.factory.close();
	}

}

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

@Component
public class CreateSession implements ComponentFactory<Session> {

	private final SessionFactory factory;
	private Session session;

	public CreateSession(SessionFactory factory) {
		this.factory = factory;
	}

	@PostConstruct
	public void abre() {
		this.session = factory.openSession();
		//this.session.setFlushMode(FlushMode.COMMIT);
		//this.session.setCacheMode(CacheMode.REFRESH);
	}

	public Session getInstance() {
		return this.session;
	}

	@PreDestroy
	public void fecha() {
		this.session.close();
	}

}

isso é uma session por request… não deveria ter cache

Agora você vem falar pra mim!?
Eu sou Leigo no negóciooooooo jkkkkkk

Então, pensei no flush(), o que você acha?

se você comitou a transação já deveria ir pro banco de dados automaticamente, não precisa do flush…

habilita o show_sql e vê se as selects estão sendo feitas.

no hibernate.cfg.xml, coloque:

<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />

e veja em que momento os selects/inserts estão sendo feitos. daí vc tem uma idéia melhor se precisa fazer o flush ou não

Bom, na verdade sempre deixo isso ligado, gosto de ver os selects e inserts sempre…
Está fazendo select a cada requisição, sim… entretanto, verifiquei no banco, e está gravando, e não aparece, cash de página, não pode ser, testei em browsers diferentes… portanto, CACHE kkkk
Meu, realmente não sei o que fazer agora, estou sem saber por onde começar

se está aparecendo os selects a cada request NÃO é cache, pelo menos não do lado da aplicação… talvez seja algo do banco de dados…

qual você está usando?

MySQL 5…
Mas se ele está no banco as informaçlões já estão salvas no banco não pode ser do banco isso

o banco está em qual máquina? na local ou na remota?
as configurações do banco estão como localhost ou com o ip da máquina?

Estão como URL mysql.tal.com.
não estão local, estão remotas.

posta aqui o seu hibernate.cfg.xml (sem a senha do banco e coisas do tipo) das duas aplicações


&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;
&lt;hibernate-configuration&gt;
	&lt;session-factory&gt;
		&lt;property name="hibernate.connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt;
		&lt;property name="hibernate.connection.url"&gt;jdbc:mysql://mysql.quimiflex.net.br/database&lt;/property&gt;
		&lt;property name="hibernate.connection.username"&gt;user&lt;/property&gt;
		&lt;property name="hibernate.connection.password"&gt;password&lt;/property&gt;
		&lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;
		&lt;property name="show_sql"&gt;true&lt;/property&gt;

		&lt;mapping class="br.com.rhfactor.quimiflex.entidades.Categoria" /&gt;
		&lt;mapping class="br.com.rhfactor.quimiflex.entidades.Item" /&gt;

	&lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;