Java Hibernate 3-当前会话中的多个查询

Java Hibernate 3-当前会话中的多个查询,java,sql,hibernate,Java,Sql,Hibernate,在会话点中,我想启动一个执行 12000选择和4810插入(这是一个循环,我有一个对象列表,可以在其中设置5个属性,每次启动saveOrUpdate) 我的问题在于我在Eclipse控制台中发现了一个错误。但是如果我重新启动这段代码,错误行就会改变 我认为问题在于大量的查询或缓存问题,或者我不知道。 立即纠正错误: Unable to acquire JDBC Connection at org.hibernate.exception.internal.StandardSQLExceptionC

在会话点中,我想启动一个执行 12000选择和4810插入(这是一个循环,我有一个对象列表,可以在其中设置5个属性,每次启动saveOrUpdate)

我的问题在于我在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中,我控制hibernate查询的where条件存在,并且有效地没有问题

错误出现在执行过程中,而不是开始时,因此不要认为这是一个问题

查询的类型很简单:

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();
List List=(List)getSession(em)(我的会话的方法)
.createCriteria(ObjectForMe.class)
.add(Restrictions.eq(“propertyBigDecimal”,新的BigDecimal(整数)))
.add(Restrictions.eq(“propertyBigDecimal1”,新的BigDecimal(整数)))
.add(Restrictions.eq(“propertyrelationstanceofobjectx”,istanceofObjectX))
.list();
我的连接jdbc没有问题。我做任何类型的测试连接,这是美妙的


感谢您的帮助

如何执行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;
    }
EntityManagerFactory emf=Persistence.createEntityManagerFactory(“manager1”);
EntityManager em=emf.createEntityManager();
EntityTransaction et=null;
试一试{
et=em.getTransaction();
等开始();

对于(int i=1;i@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;
}
控制台显示hibernate查询的method.list()中的错误,但每次启动应用程序时,行都会更改

Ok, 尝试使用ehcache:

如果您正在使用maven,请向pom.xml添加依赖项(如果不是,请下载jar文件):


org.hibernate
休眠ehcache
5.0.7.1最终版本
之后,按如下方式向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"/>

希望它能解决这个问题!

公共列表getCup(Integer-Ex,BigDecimal-per,CUF-CUF)
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();
}
抛出异常{ String hql=“从Calculos cup中选择不同的cup”; hql+=“其中cup.cupPer=:periodo和”; hql+=“cup.cupEx=:Ejercicio12和”; hql+=“cuf.cufIdint=:cufId”; org.hibernate.Query hqlQuery=getSession(em).createQuery(hql); setParameter(“periodo”,per); setParameter(“Ejercicio12”,新的BigDecimal(Ex)); hqlQuery.setParameter(“cufId”,cuf.getCufIdint()); 返回hqlQuery.list(); }
我在jdbc连接上收到了相同的错误,在hqlQuery.list()行中; 我已经在pom和持久化中激活了缓存选项

table CUP的数据具有cupEx和cupPer作为BigDecimal,并且与表cuf Rap的关系由cuf.getCufIdint()表示。
如果我在sql编辑器中启动查询(show_sql activated),则该行存在。

我也删除了saveOrUpdate,但错误相同。是的,不要删除saveOrUpdate…只需查看您的提交位置,因为这就像您在构建实体时提交sql请求一样(我认为)…我同意…只要在等待有好的响应时尝试一个技巧…每1000次持续添加1秒的时间睡眠…并告诉我它是如何工作的!对于线程-您是否感觉到引入的延迟?或者它与以前一样?请共享您的代码…没有..相同的错误。我也使用了hql,错误在query.toList…我公开了这是hql
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();
}