2012-03-19 140 views
1

当我使用Jasper作为接口时,有时接口调用jasper并生成报告,然后我们得到了例外如下:Jasper Report Error:ORA-01555:snapshot too old:rollback segment number with name“”too small ORA-22924:snapshot too old

================================================================================ 
org.springframework.jdbc.UncategorizedSQLException: 
    Hibernate operation: Could not execute JDBC batch update; 
    uncategorized SQLException for SQL [update JIRepositoryCache set data=?, version=?, version_date=?, item_reference=? where id=?]; 
SQL state [72000]; 
error code [1555]; ORA-01555: snapshot too old: rollback segment number with name "" too small 
ORA-22924: snapshot too old 

; nested exception is java.sql.BatchUpdateException: ORA-01555: snapshot too old: rollback segment number with name "" too small 


ORA-22924: snapshot too old 



    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) 

    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 

    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 

    at org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424) 

    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:410) 

    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) 

    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 

    at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1055) 

    at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1048) 

    at com.jaspersoft.jasperserver.api.metadata.common.service.impl.hibernate.HibernateRepositoryCache.getCachedItem(HibernateRepositoryCache.java:126) 

    at com.jaspersoft.jasperserver.api.metadata.common.service.impl.hibernate.HibernateRepositoryCache.getCachedItem(HibernateRepositoryCache.java:99) 

    at com.jaspersoft.jasperserver.api.metadata.common.service.impl.hibernate.HibernateRepositoryCache.cache(HibernateRepositoryCache.java:67) 

    at sun.reflect.GeneratedMethodAccessor556.invoke(Unknown Source) 

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

    at java.lang.reflect.Method.invoke(Method.java:597) 

    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) 

    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 

    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 

    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 

    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 

    at com.jaspersoft.jasperserver.api.common.util.spring.ReattemptMethodInterceptor.invoke(ReattemptMethodInterceptor.java:51) 

    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 

    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 

    at $Proxy16.cache(Unknown Source) 

    at com.jaspersoft.jasperserver.multipleTenancy.PathTransformationRepositoryCache.cache(PathTransformationRepositoryCache.java:52) 

    at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl.getCompiledReport(EngineServiceImpl.java:897) 

    at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl.getJasperReport(EngineServiceImpl.java:659) 

    at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl.fillReport(EngineServiceImpl.java:369) 

    at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl.executeReport(EngineServiceImpl.java:872) 

    at com.jaspersoft.jasperserver.api.engine.jasperreports.domain.impl.ReportUnitRequest.execute(ReportUnitRequest.java:57) 

    at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl.execute(EngineServiceImpl.java:319) 

    at com.jaspersoft.ji.engine.ProEngineServiceImpl.execute(ProEngineServiceImpl.java:132) 

    at com.jaspersoft.jasperserver.api.engine.scheduling.quartz.ReportExecutionJob.executeReport(ReportExecutionJob.java:494) 

    at com.jaspersoft.ji.report.options.engine.ReportOptionsExecutionJob.executeReport(ReportOptionsExecutionJob.java:103) 

    at com.jaspersoft.jasperserver.api.engine.scheduling.quartz.ReportExecutionJob.executeAndSendReport(ReportExecutionJob.java:422) 

    at com.jaspersoft.jasperserver.api.engine.scheduling.quartz.ReportExecutionJob.execute(ReportExecutionJob.java:231) 

    at org.quartz.core.JobRunShell.run(JobRunShell.java:195) 

    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520) 

Caused by: java.sql.BatchUpdateException: ORA-01555: snapshot too old: rollback segment number with name "" too small 

ORA-22924: snapshot too old 



    at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343) 

    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10698) 

    at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297) 

    at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297) 

    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 

    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 

    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 

    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168) 

    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:322) 

    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 

    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028) 

    at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390) 

    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:420) 

    ... 32 more 
================================================================================ 

在数据库中,不存在ORA-015555和ORA-22924出现。我们增加了undo_retention参数到8小时,仍然存在问题。

有没有人遇到过这个问题以前的解决方案?

+0

什么版本的Oracle您使用的是? – Mat 2012-03-19 09:23:22

+0

其实,我不认为这个问题与Oracle版本有关。 – thexiejiang 2012-03-19 23:43:43

回答

2

可能您正尝试一次读取太多的LOB。 如果是这样的 - 然后

  1. 尝试重新定义什么exacly LOBS阅读(可能的原因是SELECT * FROM table_with_many_lobs删除,你的问题就解决了。)
  2. 试着增加滞留区大小(读​​here
  3. 尝试调整用于保留每列的保留数据的默认存储百分比。像

    ALTER TABLE YOUR_LOB_TABLE MODIFY LOB(LOB_COLUMN_NAME)(PCTVERSION 50);

例如。 希望这有助于)

0

这里是很不错的页面在这个问题上: http://www-01.ibm.com/support/docview.wss?uid=swg21188547

Oracle uses rollback segments to store the data that is changed in a transaction. This data is used to restore the original data if a rollback occurs in the transaction.

Also, the data in the rollback segment is used to guarantee read-consistency. That is, that a query always sees the same data even though it might be modified in the middle of the query.

The ORA-01555 occurs if a rollback segment runs out of space.

+2

请注意,[只提供链接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info),所以答案应该是搜索解决方案的终点(vs.而另一个引用的中途停留时间往往会随着时间推移而过时)。请考虑在此添加独立的摘要,并将链接保留为参考。 – kleopatra 2013-10-13 08:44:14