我有使用Spring JPA和Hibernate连接到ORACLE 11g数据库的Java应用程序。
有时,我需要在数据库中使用drop partition
并将所有UNUSABLE global indexes
重建为USABLE状态。 (由于执行drop partition命令,索引变得不可用)
在删除分区和尚未重建UNUSABLE索引之间,我的在线应用程序失败,并显示ORA-01502 error
,如下所示。
Caused by: java.sql.BatchUpdateException: ORA-01502: index 'USER.INDEX_NAME' or partition of such index is in unusable state
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10070)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:213)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 94 more
在SQL中,可以通过设置
skip_unusable_indexes=TRUE
来忽略UNUSABLE索引。这样,查询优化器将选择不使用索引的其他(昂贵的)执行计划,并且不会报告由于无法使用索引而导致DML
查询失败的情况。Hibernate中是否有类似的选项可供我使用,以使索引处于UNUSABLE状态时不会失败?
我正在使用的版本
休眠状态:3.6.9
甲骨文:11g
爪哇:7
最佳答案
您可以重建索引:
ALTER INDEX USER.INDEX_NAME REBUILD;