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

时间:2016-02-12 11:51:08

标签: java sql hibernate

在会话点我想要启动一个执行的代码块 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();

这不是我的连接jdbc的问题。我做任何类型的测试连接,这太棒了。

感谢您的帮助

4 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分: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;
}

控制台在hibernate查询的方法.list()中显示错误但是每次启动应用程序时,行都会更改

答案 2 :(得分:0)

确定, 尝试使用ehcache:

如果您正在使用maven,则

为您的pom.xml添加依赖项(如果没有,则下载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"/>

希望它能解决问题!

答案 3 :(得分: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和persistence中激活了缓存选项;

表CUP的数据具有cupEx和cupPer作为BigDecimal,以及与cuf.getCufIdint()相关的表cuf的关系。 如果我在Sql编辑器中启动查询(show_sql已激活),则存在该行..