微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle Continuos 查询通知 ORA-29979

如何解决Oracle Continuos 查询通知 ORA-29979

我正在尝试使用 Oracle JDBC 从 Oracle 表 (19c) 注册更改通知。由于查询包含一个 JOIN,我正在使用 BEST 努力模式。我的用户已被“授予”更改通知权限。

此时我只是想让通知程序接受任何查询。这不是最终版本,但我知道我们需要一个涉及两个带有连接的表的查询。 将查询更改为诸如 SELECT * from SCDAT.SECURITIES WHERE SCDAT.SECURITIES.INSTYPE = 28 之类的更简单的内容会产生相同的输出

测试代码

log.info("init changelistener");

    log.info("Get datasource from Spring application context");
    oracleDataSource = context.getBean("dataSource",OracleDataSource.class);

    log.info("Cet Oracle connection from datasource");
    oracle.jdbc.OracleConnection connection = (OracleConnection) oracleDataSource.getConnection();

    Properties properties = new Properties();
    properties.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS,"true");
    properties.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION,"true");
    properties.setProperty(OracleConnection.DCN_BEST_EFFORT,"true");
    log.info("DCN property settings: {}",properties);

    log.info("Register change notification to connection");
    dcr = connection.registerDatabaseChangeNotification(properties);

    //create statement
    Statement stmt = connection.createStatement();

    // associate the statement with the registration:
    ((OracleStatement) stmt).setDatabaseChangeRegistration(dcr);

    log.info("Executing query {}",query);
    ResultSet rs = stmt.executeQuery(query);

    while (rs.next()) {
        // Do nothing
    }

    log.info("attach listener to the processor");
    dcr.addListener(this);

    String[] tableNames = dcr.getTables();
    for (int i = 0; i < tableNames.length; i++)
        log.info(tableNames[i] + " is part of the registration.");

日志输出

2021-03-30 12:56:15.983  INFO 5180 --- [main] c.c.dbnotifier.Oraclechangelistener      : init changelistener
2021-03-30 12:56:15.983  INFO 5180 --- [main] c.c.dbnotifier.Oraclechangelistener      : Get datasource from Spring application context
2021-03-30 12:56:15.983  INFO 5180 --- [main] c.c.dbnotifier.Oraclechangelistener      : Cet Oracle connection from datasource
2021-03-30 12:56:16.061  INFO 5180 --- [main] c.c.dbnotifier.Oraclechangelistener      : DCN property settings: {DCN_QUERY_CHANGE_NOTIFICATION=true,DCN_BEST_EFFORT=true,DCN_NOTIFY_ROWIDS=true}
2021-03-30 12:56:16.061  INFO 5180 --- [main] c.c.dbnotifier.Oraclechangelistener      : Register change notification to connection
2021-03-30 12:56:16.077  INFO 5180 --- [main] c.c.dbnotifier.Oraclechangelistener      : Executing query SELECT SCDAT.TRANSMAIN.TRANSEX from SCDAT.TRANSMAIN,SCDAT.SECURITIES WHERE SCDAT.TRANSMAIN.SECIK = SCDAT.SECURITIES.SECIK AND SCDAT.SECURITIES.INSTYPE = 28
2021-03-30 12:56:16.295  WARN 5180 --- [main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'oraclechangelistener': Invocation of init method Failed; nested exception is java.sql.sqlException: ORA-29979: ikke støttet radstørrelse for endringsvarsling for spørringsresultat

此处解释了错误 ORA-29979 https://www.oraexcel.com/database-oracle-11gR2-ORA-29979,但根据 dbadmin,数据库上的 COMPATIBLE 设置为 19.0.0。

我应该补充一点,在 sqldeveloper 中使用相同的用户运行查询可以正常工作。

关于如何进行的任何建议或想法?

/卡特琳娜

解决方法

您将不得不切换到“表更改通知”,因为您的表有太多列无法支持“查询更改通知”。 删除此行或将其注释掉:

// properties.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION,"true");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。