超出最大打开游标 - 使用休眠SchemaValidator

时间:2016-02-05 15:39:31

标签: java oracle hibernate

我们的Oracle 11g数据库包含298个表(最近添加了10个),(+100个序列),我们声明了500个游标。

当启动我们的WebApplication(Tomcat 7.0,jdbc池)时,在sessionFactory初始化时,当hibernate验证模式时,它使用所有游标(参见下文)。

为了让hibernate对Oracle游标不那么贪心,有什么已知的东西吗?

请注意,此问题与预处理语句或hibernate实体的处理无关,因为在此步骤中我不与它们中的任何一个一起使用。

    Caused by: org.hibernate.exception.GenericJDBCException: could not get table metadata: MYTABLE
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
        at org.hibernate.tool.hbm2ddl.DatabaseMetadata.getTableMetadata(DatabaseMetadata.java:105)
        at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1080)
        at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:116)
        at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:317)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
        at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
        at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:863)
        at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:782)
        at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1573)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1511)
        ... 34 more
    Caused by: java.sql.SQLException: ORA-01000: maximum open cursors exceeded

        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
        at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
        at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:53)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:774)
        at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1111)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798)
        at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4845)
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1501)
        at oracle.jdbc.driver.OracleDatabaseMetaData.getColumnsWithWildcards(OracleDatabaseMetaData.java:350)
        at oracle.jdbc.driver.OracleDatabaseMetaData.getColumns(OracleDatabaseMetaData.java:128)
        at org.hibernate.tool.hbm2ddl.TableMetadata.initColumns(TableMetadata.java:146)
        at org.hibernate.tool.hbm2ddl.TableMetadata.<init>(TableMetadata.java:32)
        at org.hibernate.tool.hbm2ddl.DatabaseMetadata.getTableMetadata(DatabaseMetadata.java:90)
        ... 44 more

1 个答案:

答案 0 :(得分:6)

如果你的驱动程序版本是12.1.0。 2 那么这是一个已知错误:

https://community.oracle.com/thread/3682300

简而言之:DatabaseMetaData.getTableTypes()创建一个Statement但永远不会关闭它,它会使光标保持打开状态。

很可能Hibernate在模式验证期间经常调用getTableTypes(),因此您会受到此错误的影响。

驱动程序版本12.1.0。 1 不受此影响,因此您可能希望降级。

这是在Bug#19632480下记录的,所以如果您有权访问MOS,可以为此下载补丁。