[Resolvido!]Dados desatualizados! Hibernate/tomcat/primefaces

Pessoal, estou com um problema muito chato. Pesquisei muito e não consegui resolver.
É o seguinte, toda vez que eu carrego a pagina pela primeira vez… ela carrega os dados exatamente como esta no banco de dados, entretanto caso alguma alteração tenha sido feita, não importa o jeito que eu tento atualizar a pagina e os dados carregados sempre são iguais a primeira vez que eu carreguei, a única solução é quando eu reinicio o tomcat, entretanto minha aplicação não pode ficar com esse bug pois a alteração dos dados ocorre numa frequência muito curta!

Para resolver este problema ou mesmo podermos opinar sobre o que ocorre, precisamos entender qual o contexto no qual esta situação ocorre.
Você tem uma grid, pelo que entendi e, esta grid não atualiza.
Pois bem, quais são as situações?

  • Utiliza JDBC? JPA? Se JPA qual a implementação? A alteração nos dados é efetuada pelo mesmo sistema? É efetuada diretamente na base de dados?
  • A aplicação conta com acesso direto à base de dados ou é através de pool de conexões?

JPA = Hibernate.
Creio que seja pool de conexões.
segue a configuração do Hibernate!

<?xml version='1.0' encoding='utf-8'?>
<session-factory>

	<!-- Database connection settings -->
	<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
	<property name="connection.url">jdbc:mysql://xxxxxxx:3306/sfmsp-homo?zeroDateTimeBehavior=convertToNull</property>
	<property name="connection.username">root</property>
	<property name="connection.password">xxxxx</property>

	<!-- JDBC connection pool (use the built-in) -->
	<property name="connection.pool_size">1</property>

	<!-- SQL dialect -->
	<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

	<!-- Enable Hibernate's automatic session context management -->
	<property name="current_session_context_class">thread</property>

	<!-- Disable the second-level cache -->
	<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

	<!-- Echo all executed SQL to stdout -->
	<property name="show_sql">true</property>

	<!-- Mapeamento das entidades -->
	<mapping class="hagape.domain.tb_tipo_negocio" />
	<mapping class="hagape.domain.tb_categoria_produto" />
	<mapping class="hagape.domain.tb_produto" />
	<mapping class="hagape.domain.tb_medida" />
	<mapping class="hagape.domain.tb_estoque" />
	<mapping class="hagape.domain.tb_estoque_produto" />
	<mapping class="hagape.domain.tb_cidade" />
	<mapping class="hagape.domain.tb_uf" />
	<mapping class="hagape.domain.tb_unidade_medida" />

</session-factory>

e a classe bean:

package hagape.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.Application;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;

import org.omnifaces.util.Messages;

import hagape.dao.EstoqueDAO;
import hagape.dao.EstoqueProdutoDAO;
import hagape.dao.ProdutoDAO;
import hagape.domain.tb_estoque;
import hagape.domain.tb_estoque_produto;
import hagape.domain.tb_produto;

@SuppressWarnings(“serial”)
@ViewScoped
@ManagedBean
public class EstoqueProdutoBean implements Serializable {
private tb_estoque_produto estoqueProduto;
private List<tb_estoque> estoques;
private List<tb_produto> produtos;
private List<tb_estoque_produto> estoqueProdutos;

public tb_estoque_produto getEstoqueProduto() {
	return estoqueProduto;
}

public void setEstoqueProduto(tb_estoque_produto estoqueProduto) {
	this.estoqueProduto = estoqueProduto;
}

public List<tb_estoque> getEstoques() {
	return estoques;
}

public void setEstoques(List<tb_estoque> estoques) {
	this.estoques = estoques;
}

public List<tb_produto> getProdutos() {
	return produtos;
}

public void setProdutos(List<tb_produto> produtos) {
	this.produtos = produtos;
}

public List<tb_estoque_produto> getEstoqueProdutos() {
	return estoqueProdutos;
}

public void setEstoqueProdutos(List<tb_estoque_produto> estoqueProdutos) {
	this.estoqueProdutos = estoqueProdutos;
}

@PostConstruct
public void listar() {
	try {
		estoqueProduto = new tb_estoque_produto();
		ProdutoDAO produtoDAO = new ProdutoDAO();
		produtos = produtoDAO.listar("txt_nome");
		EstoqueDAO estoqueDAO = new EstoqueDAO();
		estoques = estoqueDAO.listar();
		EstoqueProdutoDAO estoqueProdutoDAO = new EstoqueProdutoDAO();
		estoqueProdutos = estoqueProdutoDAO.listar();
		FacesContext context = FacesContext.getCurrentInstance();
		Application application = context.getApplication();
		javax.faces.application.ViewHandler viewHandler = application.getViewHandler();
		UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
		context.setViewRoot(viewRoot);
		context.renderResponse();

	} catch (RuntimeException e) {
		e.printStackTrace();
		Messages.addGlobalError("Erro ao tentar carregar 'Lista'!");
	}
}

public void refresh() {
	try {
		estoqueProduto = new tb_estoque_produto();
		ProdutoDAO produtoDAO = new ProdutoDAO();
		produtos = produtoDAO.listar("txt_nome");
		EstoqueDAO estoqueDAO = new EstoqueDAO();
		estoques = estoqueDAO.listar();
		EstoqueProdutoDAO estoqueProdutoDAO = new EstoqueProdutoDAO();
		estoqueProdutos = new ArrayList<>();
		List<tb_estoque_produto> estoqueProdutos1 = estoqueProdutoDAO.listar();
		estoqueProdutos = estoqueProdutos1;
		FacesContext context = FacesContext.getCurrentInstance();
		Application application = context.getApplication();
		javax.faces.application.ViewHandler viewHandler = application.getViewHandler();
		UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
		context.setViewRoot(viewRoot);
		context.renderResponse();

	} catch (RuntimeException e) {
		e.printStackTrace();
		Messages.addGlobalError("Erro ao tentar carregar 'Lista'!");
	}
}

}

Como você esta alterando os dados?

diretamente no banco de dados, ou o sistema da empresa… o problema e apartir da primeira vez que eu acesso eu criei um botao pra dar refresh mas sempre ele carrega os dados da primeira vez que eu acesso a pagina isso que e foda pq nao da erro … entao creio que o problema seja algum tipo de cache sei la alguma coisa parecida!

Um amigo meu do trabalho estava enfrentando uma situação semelhante.
No caso dele o problema era que um relacionamento do projeto estava sendo carregado como EAGER.
Existe algum lugar do seu projeto que você esteja fazendo EAGER load?

Mostra o código que está fazendo a gravação e em que momento você fecha a session do Hibernate. Pra ter decidido usar hibernate então você quer hibernar os dados por um tempo, isso está acontecendo, só tem que ver o momento de encerrar isso, realizando o flush, commitando e fechando a sessão.

1 curtida

Pessoal consegui encontrar o erro…
eu abri uma nova transação e dei comit no final do metodo assim que possivel eu disponibilizo o código porque isso pode ser duvida pra muitas pessoas novas tbm …
Obrigado pessoal!

Com certeza, o cache do hibernate é separado do banco e não tem como advinhar quando vc altera os dados diretamente no banco.

1 curtida