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

8 respostas
P

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!

8 Respostas

D

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?
P

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'!");
	}
}

}

P

Como você esta alterando os dados?

P

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!

O

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?

J

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.

P

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!

P

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

Criado 20 de fevereiro de 2017
Ultima resposta 23 de fev. de 2017
Respostas 8
Participantes 5