2016-02-12 16 views
0

在會話點我想啓動一個代碼塊執行 12000選擇和4810插入(這是一個循環,我有一個對象列表,我可以設置5個屬性併爲每個我啓動saveOrUpdate)。休眠3 - 在當前會話中的許多查詢

我的問題是,在Eclipse控制檯中,我發現一個錯誤。但是,如果我重新啓動這段代碼,錯誤的行會改變。

我認爲問題是大量的查詢或緩存問題,或者我不知道。 立刻錯誤:

Unable to acquire JDBC Connection 
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95) 
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:90) 
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:112) 
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:47) 
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:146) 
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172) 
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148) 
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1928) 
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1897) 
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1875) 
at org.hibernate.loader.Loader.doQuery(Loader.java:919) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) 
at org.hibernate.loader.Loader.doList(Loader.java:2611) 
at org.hibernate.loader.Loader.doList(Loader.java:2594) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423) 
at org.hibernate.loader.Loader.list(Loader.java:2418) 
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109) 
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1701) 
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363) 
at ........(***myfile:this line changes on every launch***) 

在的System.out.println,我控制該休眠查詢的where條件存在,和effectly存在用於這就是沒有問題。

錯誤出現在執行中,而不是在開始,所以不要認爲是一個問題的地方。

查詢類型很簡單:

List<ObjectForMe> list = (List<ObjectForMe>) getSession(em) (method for my session) 
.createCriteria(ObjectForMe.class)         
.add(Restrictions.eq("propertyBigDecimal",new BigDecimal(Integer))) 
.add(Restrictions.eq("propertyBigDecimal1",new BigDecimal(Integer))) 
.add(Restrictions.eq("propertyRelationIstanceofObjectX",istanceofObjectX)) 
.list(); 

這不是我的JDBC連接問題。我做任何類型的測試連接,這很好。

謝謝你幫我

+0

請分享您的代碼... – Shiva

回答

0

你如何執行所Hibernate的EntityTransaction提交?你的提交是在for循環嗎?

我建議不要放在for循環的承諾...只是承諾到底什麼時候你的實體建造..

這裏有一個例子:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1"); 
    EntityManager em = emf.createEntityManager(); 

    EntityTransaction et = null; 

    try { 

     et = em.getTransaction(); 
     et.begin(); 

     for(int i = 1; i <= 100000; i++) 
     { 
      em.persist(user[i]); 
     } 
     et.commit(); 

    } catch (RuntimeException e) { 
     if (et.isActive()) 
      et.rollback(); 
     throw e; 
    } 
+0

我也刪除了saveOrUpdate,但錯誤是一樣的。 – Alex

+0

是的,不要刪除saveorupdate ...只是看看你的提交 – taboubim

+0

,因爲它就像你在構建實體(我認爲)時提交sql請求... – taboubim

0

@Shiva我的代碼類似於代碼暴露@taboubim:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1"); 
EntityManager em = emf.createEntityManager(); 

EntityTransaction et = null; 

try { 

    et = em.getTransaction(); 
    et.begin(); 

    for(Object o1: listObject) 
    { 
     select query1; 
     select query2; 
     select query3; 
     o1.set(resultQuery1); 
     o1.set(resultQuery2); 
     o1.set(resultQuery3); 
    //et.saveOrUpdate(o1); that i removed for test 
    } 
    et.commit(); 

} catch (RuntimeException e) { 
    if (et.isActive()) 
     et.rollback(); 
    throw e; 
} 

控制檯顯示方法.LIST()休眠查詢的錯誤,但每次啓動應用程序時,行更改

0

好吧, 用的Ehcache嘗試:

添加依賴關係你的pom.xml如果你正在使用maven(或下載jar文件如果不):

 <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-ehcache</artifactId> 
      <version>5.0.7.Final</version> 
     </dependency> 

後屬性添加到您的persistence.xml如下:

<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/> 
<property name="hibernate.cache.use_second_level_cache" value="true"/> 
<property name="hibernate.cache.use_query_cache" value="true"/> 

希望它能解決問題!

+0

沒有..相同的錯誤。我也用hql和錯誤是在query.toList ...我暴露了這個hql – Alex

0
public List<CUP> getCup(Integer Ex, BigDecimal per, CUF cuf) 
     throws Exception { 
    String hql = "SELECT distinct cup FROM Calculos cup"; 
    hql += " WHERE cup.cupPer = :periodo AND "; 
    hql += " cup.cupEx = :Ejercicio12 AND "; 
    hql += " cuf.cufIdint = :cufId "; 
    org.hibernate.Query hqlQuery = getSession(em).createQuery(hql); 
    hqlQuery.setParameter("periodo", per); 
    hqlQuery.setParameter("Ejercicio12", new BigDecimal(Ex)); 
    hqlQuery.setParameter("cufId", cuf.getCufIdint()); 
    return hqlQuery.list(); 
} 

我在jdbc連接上收到同樣的錯誤,在行hqlQuery.list(); 我已經在POM和持久化中激活了緩存選項;

表CUP的數據將cupEx和cupPer設置爲BigDecimal,並與cuf.getCufIdint()提供的表cuf的關係。 如果我在Sql編輯器中啓動查詢(show_sql激活),則該行存在。