2017-09-15 1 views
0

Ich habe ein Problem mit Hibernate. Jedes Mal, wenn ich eine Methode aufruft, die eine Abfrage oder ein Update für die Datenbank ausführt, öffnet Hibernate eine Sitzung in der Datenbank und schließt dann nicht. Ich habe alles versucht, aber jedes Mal heißt es em.getTransaction.begin(); Es erstellt eine Sitzung in Oracle bd und schließt nicht mehr.Hibernate schließt keine Verbindungen/Sitzungen auf DB

Im Folgenden finden Sie die Details meines Codes (persistence.xml, GenericDAO usw.)

<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()); 
     } 
    } 
} 

Zugang DAO Klasse:

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); 
    } 

Ai eu vor der Kamera Fassade vor der Kamera Modell, die eine Schnittstelle zu einem anderen DAO:

Ich habe eine Facade Klasse für jede Model Klasse, die die DAO-Zugriffs-Schnittstelle macht:

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; 
    } 

Wenn ich listall() Funktion oder eine beliebige namedWaury nennen, kann ich diese geöffneten Verbindungen ohnehin nicht schließen. Ich habe einen einfachen Test in einer Main Klasse gemacht:

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); 
      } 
     } 


    } 
} 

Wie Sie eine Transaktion jedes Mal in meiner Fassade Klasse sehen können, beginne ich, schließe ich es, aber dies geschieht nicht in Oracle, wo ein Sitzung wird für jede beginTransaction meines EntityManager erstellt.

+0

Gibt es nicht irgendwo einen Verbindungspool? –

+0

@UsagiMiyamoto, ich definiere nicht explizit einen Verbindungspool, aber Hibernate stellt standardmäßig die Poolgröße auf 20. 'set 15, 2017 9:19:23 AM org.hibernate.engine.jdbc.connections.internal. PooledConnections INFO: HHH000115: Ruhezustand Verbindungspoolgröße: 20 (min = 1) ' – user6798449

Antwort

0

Nach vielen Versuchen fand ich nur einen Beitrag, dass ich zu commit oder rollback jedes Mal, wenn ich beginTransaction() Methode meiner Entity-Manager anrufen. So ändere ich meinen Code wie dies in der GenericDA.java Klasse:

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

ich immer noch, warum Hibernate zwingt mich zu verstehen versucht, eine Transaktion auch in einer Abfrage-Anweisung COMMIT, und ich denke, dass ich eine große Leistung verdienen kann, ohne TU es. Aber diese Änderung funktioniert wie ein Zauber für mich.

Verwandte Themen