2017-09-15 104 views
0

我有使用Hibernate的問題。每次我調用一個對數據庫執行查詢或更新的方法時,hibernate在數據庫中打開一個會話,然後不關閉。我試過所有的東西,但實際上每次它都被稱爲em.getTransaction.begin();它在Oracle bd中創建一個會話並且不再關閉。休眠不關閉DB上的連接/會話

下面是我的代碼(persistence.xml中,GenericDAO等)

<persistence version="2.0" 
      xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 


    <persistence-unit name="FilaTrello" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <class>integration.wcc.model.Chamado</class> 

     <properties> 
      <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@//10.ip.aqui/xxxint.xxx.com.br"/> 
      <property name="javax.persistence.jdbc.user" value="x_SUPORTE"/> 
      <property name="javax.persistence.jdbc.password" value="x_SUPORTE"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/> 
      <property name="hibernate.connection.shutdown" value="true"/> 
      <!-- <property name="hibernate.hbm2ddl.auto" value="none"/> --> 
      <property name="hibernate.synonyms" value="true"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="false"/> 
      </properties> 

    </persistence-unit> 
</persistence> 

GenericDAO細節:

package integration.wcc.dao; 

import javax.persistence.*; 
import javax.persistence.criteria.CriteriaQuery; 
import java.io.Serializable; 
import java.util.List; 
import java.util.Map; 
abstract class GenericDAO<T> implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("FilaTrello"); 
    private EntityManager em = emf.createEntityManager();; 


    private Class<T> entityClass; 

    public void beginTransaction() { 
      em.clear(); 
      em.getTransaction().begin(); 

    } 

    public void commit() { 
     em.getTransaction().commit(); 
    } 

    public void rollback() { 
     em.getTransaction().rollback(); 
    } 

    public void closeTransaction() { 
     em.close(); 
    } 

    public void commitAndCloseTransaction() { 
     commit(); 
     closeTransaction(); 
    } 

    public void flush() { 
     em.flush(); 
    } 

    public void joinTransaction() { 
     em = emf.createEntityManager(); 
     em.joinTransaction(); 
    } 

    public GenericDAO(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 

    public void save(T entity) { 
     em.persist(entity); 

    } 

    public void delete(Object id, Class<T> classe) { 
     T entityToBeRemoved = em.getReference(classe, id); 

     em.remove(entityToBeRemoved); 
    } 

    public T update(T entity) { 
     return em.merge(entity); 
    } 

    public T find(int entityID) { 
     return em.find(entityClass, entityID); 
    } 

    public T findL(Long entityID) { 
     return em.find(entityClass, entityID); 
    } 

    public T findReferenceOnly(int entityID) { 
     return em.getReference(entityClass, entityID); 
    } 

    // Using the unchecked because JPA does not have a 
    // em.getCriteriaBuilder().createQuery()<T> method 
    @SuppressWarnings({"unchecked", "rawtypes"}) 
    public List<T> findAll() { 
     CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     return em.createQuery(cq).getResultList(); 
    } 

    // Using the unchecked because JPA does not have a 
    // query.getSingleResult()<T> method 
    @SuppressWarnings("unchecked") 
    protected T findOneResult(String namedQuery, Map<String, Object> parameters) { 
     T result = null; 

     try { 
      Query query = em.createNamedQuery(namedQuery); 

      // Method that will populate parameters if they are passed not null and empty 
      if (parameters != null && !parameters.isEmpty()) { 
       populateQueryParameters(query, parameters); 
      } 

      result = (T) query.getSingleResult(); 

     } catch (NoResultException e) { 
      System.out.println("No result found for named query: " + namedQuery); 
     } catch (Exception e) { 
      System.out.println("Error while running query: " + e.getMessage()); 
      e.printStackTrace(); 
     } 

     return result; 
    } 

    @SuppressWarnings("unchecked") 
    protected List<T> findListResult(String namedQuery, Map<String, Object> parameters) { 
     List<T> result = null; 

     try { 
      Query query = em.createNamedQuery(namedQuery); 

      // Method that will populate parameters if they are passed not null and empty 
      if (parameters != null && !parameters.isEmpty()) { 
       populateQueryParameters(query, parameters); 
      } 

      //result = (T) query.getSingleResult(); 
      result = (List<T>) query.getResultList(); 

     } catch (NoResultException e) { 
      System.out.println("No result found for named query: " + namedQuery); 
     } catch (Exception e) { 
      System.out.println("Error while running query: " + e.getMessage()); 
      e.printStackTrace(); 
     } 

     return result; 
    } 


    private void populateQueryParameters(Query query, Map<String, Object> parameters) { 
     for (Map.Entry<String, Object> entry : parameters.entrySet()) { 
      query.setParameter(entry.getKey(), entry.getValue()); 
     } 
    } 
} 

訪問DAO類:

public class FilaChamadoDAO extends GenericDAO<FilaChamado> { 

    private static final long serialVersionUID = 1L; 

    public FilaChamadoDAO() { 
     super(FilaChamado.class); 
    } 

public List<FilaChamado> findTicketsByFila(int idFila,String listType) { 
     Map<String, Object> parameters = new HashMap<String, Object>(); 
     parameters.put("filaNumber", idFila); 
     parameters.put("listParam", listType); 

     return super.findListResult(FilaChamado.FIND_TICKETS_FILA_BY_FILA, parameters); 
    } 

艾歐盟模型meu,que faz a interface de acesso ao DAO:

我有一個Facade類爲每個Model類,這使得DAO接入接口:

public class FilaChamadoFacade { 

     private FilaChamadoDAO FilaChamadoDAO = new FilaChamadoDAO(); 

     public List<FilaChamado> listAll() { 
      FilaChamadoDAO.beginTransaction(); 
      List<FilaChamado> result = FilaChamadoDAO.findAll(); 
      FilaChamadoDAO.closeTransaction(); 
      return result; 
     } 

public List<FilaChamado> findTicketsByFila(int idFila,String listaDestino) { 
     List<FilaChamado> result = null; 
     try { 
      FilaChamadoDAO.beginTransaction(); 
      result = FilaChamadoDAO.findTicketsByFila(idFila, listaDestino); 
      FilaChamadoDAO.flush(); 
     } catch (HibernateException e) { 
      if (FilaChamadoDAO != null) { 
       FilaChamadoDAO.rollback(); 
      } 
      e.printStackTrace(); 
     } finally { 
      FilaChamadoDAO.closeTransaction(); 

     } 
     return result; 
    } 

當我打電話ListAll()函數或任何namedWaury,我不能反正關閉這些打開的連接。 我在一個Main類做了一個簡單的測試:

public class TestNamedQuery { 
    public static void main(String[] args) { 

     TrelloUser trelloU = new TrelloUser(); 
     TrelloUserFacade facade2 = new TrelloUserFacade(); 
     List<TrelloUser> trelloUsers1 = new ArrayList<TrelloUser>(); 
     trelloUsers1 = facade2.listAll(); 

     for (TrelloUser trelloUser : trelloUsers1) { 
      if(trelloUser.getUserToken() != null) { 
       System.out.println("Selectss do usuario: "+trelloUser.getUserName()); 
       ChamadoCard cards = new ChamadoCard(); 
       cards.InsereChamado(trelloUser); 
      } 
     } 


    } 
} 

正如你可以看到,在我每次啓動一個事務時我的門面類,我關閉它,但這並不在Oracle中,發生一個地方會話是爲我的EntityManager的每個beginTransaction創建的。

+0

沒有在其他地方設置連接池嗎? –

+0

@UsagiMiyamoto,我沒有明確定義任何連接池,但默認情況下休眠狀態是將池大小設置爲20. 'set 15,2017 9:19:23 AM org.hibernate.engine.jdbc.connections.internal。 PooledConnections INFO:HHH000115:Hibernate連接池大小:20(min = 1)' – user6798449

回答

0

經過大量的嘗試,我剛剛發現一個帖子,說我每次撥電話號碼beginTransaction()到我的實體管理器時都需要commitrollback。 所以我改變了這樣的代碼在GenericDA.java類:

public void closeTransaction() { 
     em.getTransaction().commit(); 
     em.close(); 
    } 

我還是想知道,爲什麼Hibernate的力量我甚至在一個查詢語句提交事務,我認爲我可以賺一個偉大的性能,而不做到這一點。 但是這種改變對我來說就像是一種魅力。

相關問題