Problema Hibernate lock em tabela e controle de transação

2 respostas
ThiagoWorldCoder

Pessoal, bom dia...

Estou com problema de lock ao realizar queries (HQL) com o Hibernate. Sempre que faço uma query, mesmo sem abrir transacao, o banco aponta lock de registros. Alguem já passou por isso ? Quando pego uma lista com 100 registros, por exemplo, todos ficam em estado de lock até que a session seja fechada.

Estou utilizando o Banco Adabas. Como não encontrei Dialeto para esse banco, peguei o dialeto do Oracle (pelo que percebi tem a sintaxe mais proxima) e fiz alguns ajustes. A conexao é gerenciada pelo Tomcat.

Tanto o AdabasDialect quanto o hibernate.cfg.xml estão o mais simples possivel.

Me disseram que talvez eu tivesse que usar org.hibernate.transaction.JTATransactionFactory, alguem sabe como posso usar essa classe ???

Exemplo de Consulta (CidadeDAO.java):

public ArrayList <CidadeBean> getListaSincronizar(SiteBean site) throws E EmpresaException {

		ArrayList<CidadeBean> listaRetorno = new ArrayList<CidadeBean>();		
		Session session = null;
		
		try { 
			
			StringBuffer hql = new StringBuffer("select c from CidadeBean c ");
		    hql.append("where c.codigoMatrizGrupo = ? ");
		    hql.append("  and rowno <= ").append(paginaAtual * linhasPorPagina);

			hql.append("order by c.codigoMatrizGrupo, c.codigo");
			
			session = HibernateUtil.getSession();
			
			Query query = session.createQuery(hql.toString())
						.setReadOnly(true)						
						.setTimeout(60)
						.setInteger(0, site.getCodigoMatrizGrupo())
						.setFirstResult(((paginaAtual - 1) * linhasPorPagina));

			
			List lista = query.list();
			if (lista != null && lista.size() > 0) {
				listaRetorno = (ArrayList<CidadeDBBean>) lista;
			}			

		} catch(Exception e) {
			
			throw new EmpresaException(DBPropriedades.CONSTANT_VALUE_SISTEMA,this.getClass().getName()+".getListaSincronizar()","99","Erro ao localizar Cidade: "+ e.getMessage());

		} finally {		  

			try {
				if (session != null) {
					session.disconnect();
					session.close();					
				}
			} catch (Exception ex) {}
			}
		}
		return listaRetorno;
	}
AdabasDialect:
public class AdabasDialect extends Dialect {

	public AdabasDialect() {
		
		super();

		registerDefaultProperties();
		
	}

	protected void registerDefaultProperties() {
		getDefaultProperties().setProperty( Environment.USE_STREAMS_FOR_BINARY, "true" );
		
		getDefaultProperties().setProperty(Environment.STATEMENT_BATCH_SIZE, NO_BATCH);		
		
		// Oracle driver reports to support getGeneratedKeys(), but they only
		// support the version taking an array of the names of the columns to
		// be returned (via its RETURNING clause).  No other driver seems to
		// support this overloaded version.
		getDefaultProperties().setProperty( Environment.USE_GET_GENERATED_KEYS, "false" );
		
	}

Hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

	<session-factory>

		<!-- Use a Tomcat 5.5 JNDI datasource -->
		<property name="hibernate.dialect"> br.com.empresa.hibernate.dialect.AdabasDialect </property>
		
		<property name="hibernate.connection.datasource">java:comp/env/jdbc/Adabas</property>

		
		<property name="connection.autocommit">false</property>
		

		<!-- XML mapping -->
		<mapping	resource="br/com/empresa/bean/map/CidadeBean.hbm.xml" />

2 Respostas

spranta

Olá Thiago, estou com o mesmo problema que você e isto está me dando muita dor de cabeça, conseguiu resolver?

gracianow

Olá Thiago, estou penando para achar uma referencia de conexao com Adabas via hibernate para implementar uma persistencia de dados e vi que você tem uma preciosidade ai neste código.
Pode me enviar algo mais sobre persistencia do Adabas em hibernate e JPA?
Lhe serei muito grato.

Criado 29 de outubro de 2009
Ultima resposta 16 de ago. de 2013
Respostas 2
Participantes 3