来自命名查询的MySQL错误

时间:2015-05-06 09:56:14

标签: mysql database hibernate sqlexception

我有一个简单的命名查询。我们对hibernate库进行了升级,我们看到了以下错误。它在以前的版本中运行良好。

简单查询失败的原因是什么?

    Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) [hibernate3.jar:]
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) [hibernate3.jar:]
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) [hibernate3.jar:]
        at org.hibernate.loader.Loader.doList(Loader.java:2545) [hibernate3.jar:]
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) [hibernate3.jar:]
        at org.hibernate.loader.Loader.list(Loader.java:2271) [hibernate3.jar:]
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:459) [hibernate3.jar:]
        at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:365) [hibernate3.jar:]
        at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) [hibernate3.jar:]
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268) [hibernate3.jar:]
        at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) [hibernate3.jar:]
        at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246) [hibernate3.jar:]
        ... 157 more
Caused by: java.sql.SQLException: java.lang.IllegalArgumentException: Negative delay

Hibernate版本为3,代码如下

String selectSql = "select m from UserEntity m";
try {
    Query query = entityManager.createQuery(selectSql);
    Collection<UserEntity> userentities = (Collection<UserEntity>) query.getResultList();

} ......

2 个答案:

答案 0 :(得分:1)

我遇到了相同的“负延迟”异常。根据我到目前为止的调查,它似乎是由于JCA层将Integer.MAX_VALUE作为查询超时传递给MySQL驱动程序。 MySQL驱动程序稍后将其翻译为1000,将其转换为毫秒,当用作java.util.Timer schedule()调用的参数时,该值溢出为负值并触发“负延迟”异常。我不确定为什么JBoss在出现此问题的特定方案中使用Integer.MAX_VALUE,因为 我在数据源XML配置中指定了显式超时。需要注意的一点是,只有在从节点加入JBoss群集后才能观察到此问题。在此之前,只有主节点正在运行时,调用查询的同一工作流程才能成功完成。

答案 1 :(得分:1)

确切的问题似乎是在使用远程EJB客户端上下文查找进行EJB调用时传播事务的方式。如果调用者处于事务中,则远程调用最终会获得无效值,在本例中为Integer.MAX_VALUE,用于JTA层中的事务超时。因此,当JCA层尝试根据JTA事务超时配置事务超时时,它最终将这个巨大的值传递给JDBC。我认为这是Jboss 6.3 EAP中最近的一个错误,因为我在以前的版本中没有看到它。