MySQL 命名查询错误
MySQL error from a named query
我有一个简单的命名查询。我们升级了 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();
}...
我遇到了同样的 "Negative delay" 异常。根据我目前的调查,这似乎是由于 JCA 层将 Integer.MAX_VALUE 作为查询超时传递给 MySQL 驱动程序。 MySQL 驱动程序稍后将其乘以 1000 以将其转换为毫秒,这会溢出为负值并在用作 java.util.Timer schedule() 调用的参数时触发 "Negative delay" 异常。我不确定为什么 JBoss 在出现此问题的特定情况下使用 Integer.MAX_VALUE,因为
我在数据源 XML 配置中指定了一个明确的超时。需要注意的一点是,只有在从节点加入 JBoss 集群后才会出现此问题。在此之前,当只有主节点是 运行 时,调用查询的相同工作流成功完成。
确切的问题似乎在于使用远程 EJB 客户端上下文查找进行 EJB 调用时传播事务的方式。如果调用者在事务中,则远程调用最终会得到一个无效值,在本例中为 Integer.MAX_VALUE,因为 JTA 层中的事务超时。因此,当 JCA 层尝试根据 JTA 事务超时配置事务超时时,它最终会将这个巨大的值传递给 JDBC。我认为这是 Jboss 6.3 EAP 中的最新错误,因为我在以前的版本中没有看到它。
我有一个简单的命名查询。我们升级了 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();
}...
我遇到了同样的 "Negative delay" 异常。根据我目前的调查,这似乎是由于 JCA 层将 Integer.MAX_VALUE 作为查询超时传递给 MySQL 驱动程序。 MySQL 驱动程序稍后将其乘以 1000 以将其转换为毫秒,这会溢出为负值并在用作 java.util.Timer schedule() 调用的参数时触发 "Negative delay" 异常。我不确定为什么 JBoss 在出现此问题的特定情况下使用 Integer.MAX_VALUE,因为 我在数据源 XML 配置中指定了一个明确的超时。需要注意的一点是,只有在从节点加入 JBoss 集群后才会出现此问题。在此之前,当只有主节点是 运行 时,调用查询的相同工作流成功完成。
确切的问题似乎在于使用远程 EJB 客户端上下文查找进行 EJB 调用时传播事务的方式。如果调用者在事务中,则远程调用最终会得到一个无效值,在本例中为 Integer.MAX_VALUE,因为 JTA 层中的事务超时。因此,当 JCA 层尝试根据 JTA 事务超时配置事务超时时,它最终会将这个巨大的值传递给 JDBC。我认为这是 Jboss 6.3 EAP 中的最新错误,因为我在以前的版本中没有看到它。