在会话点我想要启动一个执行的代码块 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的问题。我做任何类型的测试连接,这太棒了。
感谢您的帮助
答案 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已激活),则存在该行..