2017-09-15 7 views
0

Hibernateを使用しているときに問題があります。データベース上でクエリまたは更新を実行するメソッドを呼び出すたびに、hibernateはデータベース内のセッションを開き、閉じません。私はすべてを試しましたが、実際はem.getTransaction.begin()と呼ばれるたびに試しました。これはOracle bdでセッションを作成し、もう閉じません。HibernateがDBの接続/セッションを閉じない

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

愛EU以下

は私のコード(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の詳細ですテヌホュースクラッセファサードパラデコモデルモデル、インターフェイスとDAO:

私はDAOアクセスインタフェースを行い、各Modelクラス、ためFacadeクラスを持っている:私はLISTALL()関数または任意のnamedWauryを呼び出すと

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

、私はとにかくこれらの開かれた接続をクローズすることはできません。 私は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); 
      } 
     } 


    } 
} 

あなたが見ることができるように、私のファサードクラスIは、トランザクションを開始するたびに、私はそれを閉じますが、これは、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

多くの試みの後、またはrollbackに、私がエンティティマネージャーにbeginTransaction()メソッドを呼び出すたびに投稿する必要があるという記事を見つけました。 だから私はGenericDA.javaクラスでこのように私のコードを変更:

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

私はまだHibernateの力が私にもクエリ文でトランザクションをコミットする理由を理解しようとしている、と私はなしで素晴らしいパフォーマンスを稼ぐことができると思いますそれをやる。 しかし、その変更は私の魅力のように動作します。

関連する問題