Oracle 数据更改通知超时和工作流程

2024-04-05

美好时光!

我们在 Java 应用程序中配置了 Oracle DCN 功能。一切工作正常,但应用程序关闭时出现一些问题。如果应用程序意外关闭(例如,tomcat 进程通过kill -9命令),DCN 订阅者被挂在数据库中(select * from user_change_notification_regs;)。另外,我可以看到每个订阅者都有一个4294967295-second暂停。

那么有人可以建议:

1.如何为订阅者设置超时;
2.为什么即使所有 JDBC 连接都已关闭,订阅者仍处于挂起状态。好吧,如果 JDBC 连接和 DCN 订阅之间没有对应关系,那么当最后一个连接最终启动时,Oracle 如何将 DCN 发送到 Java 应用程序(是否有从 Oracle 到应用程序的任何 ping 操作,或者类似于JMS 中的持久订阅)?

UPDATE: 我找到了答案first观点。有的是OracleConnection.NTF_TIMEOUT可以设置的参数DatabaseChangeRegistration:

Properties properties = new Properties();
properties.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS, "true");
properties.setProperty(OracleConnection.DCN_BEST_EFFORT, "true");
properties.setProperty(OracleConnection.NTF_TIMEOUT, "3600");

DatabaseChangeRegistration databaseChangeRegistration = oracleConnection.registerDatabaseChangeNotification(properties);

你一直保存的记录user_change_notification_regs必须显式删除表,因为 DBMS 不会跟踪该表'准备此连接的 JDBC 连接仍然存在'这需要心跳机制。因此,当您的服务器重新启动时,您必须显式删除(取消注册)这些记录。这是一个例子。

try (Connection conn = ConnManager.getConnection();) {
         if (conn.isWrapperFor(OracleConnection.class)) {

                try (OracleConnection oracleConnection = conn.unwrap(OracleConnection.class);
                        Statement stmt = oracleConnection.createStatement()) {
                    ResultSet rs = stmt.executeQuery("select regid,callback from USER_CHANGE_NOTIFICATION_REGS");

                    while (rs.next()) {
                        long regid = rs.getLong(1);
                        String callback = rs.getString(2);
                        ((OracleConnection) stmt.getConnection()).unregisterDatabaseChangeNotification(regid, callback);
                    }
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(TableBase.class.getName()).log(Level.SEVERE, null, ex);
        } 

您可以简单地将此代码放入类的静态块或初始化方法中,该方法仅执行一次。如果您为侦听器设置超时,Oracle 服务器端驱动程序将为您的连接启用心跳机制,这可能会稍微降低应用程序性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 数据更改通知超时和工作流程 的相关文章

随机推荐

  • 如何从java通过hdfs协议访问hadoop?

    我找到了一种通过以下方式连接到hadoop的方法hftp 并且工作正常 只读 uri hftp 172 16 xxx xxx 50070 System out println uri uri Configuration conf new C
  • 如何检查 Bash 中是否存在某些文件?

    In a bash脚本 我必须检查多个文件是否存在 我知道一种尴尬的方法 如下所示 但这意味着我的主程序必须位于那个丑陋的嵌套结构中 if f FILE1 then if f FILE2 then echo OK MAIN PROGRAM
  • Python: type(i) 是 int...但 i 是 int = False

    我很确定我在做一些愚蠢的事情 但不知道那是什么 predict fn abc data In 3 predict Out 3 array 2 In 4 type predict Out 4 numpy ndarray 现在用以下内容包装我的
  • 当父div在屏幕上不可见时,jQuery UI位置函数问题

    我在 jQuery UI Position 函数方面遇到了一个奇怪的问题 有一个父 div 大于屏幕高度 其中还有另一个小 div 我的函数告诉小 div 位于其父级的底部 当底部可见时 一切正常 但是当由于窗口大小而导致底部不可见时 位置
  • Java 中函数指针最接近的替代品是什么?

    我有一个大约十行代码的方法 我想创建更多的方法来完成完全相同的事情 除了将更改一行代码的小计算之外 这是一个完美的应用程序 用于传递函数指针来替换该行 但 Java 没有函数指针 我最好的选择是什么 匿名内部类 假设你想要一个带有 a 的函
  • 使用node-sass查看所有子目录

    我见过很多使用以下命令观看特定文件夹的示例node sass 但我的 css 并不都在同一个文件夹中 我想让它像你一样监视所有子目录中的 scss 文件onchange 仅举个例子 我假设语法类似于 node sass w app scss
  • 在两个 NodeJS 微服务之间共享自定义代码

    我正在为该应用程序创建 Web 应用程序和微服务 并且两者都需要使用 Sequelize 创建相同的数据库模型 使用 NodeJS 处理此任务的方法是什么 我正在考虑创建我的数据库模型的单独模块并将其保存在私有 git 中 并将此私有 gi
  • Citrix 服务器是否支持 WebView2

    我们有一个来自第三方的应用程序 它需要WebView2 按照说明在我们的机器上安装了 WebView2 它在我们的桌面上运行良好 我们在Citrix服务器中以完全相同的方式安装 但它不起作用 知道 Citrix 服务器是否支持 WebVie
  • Flutter - 获取唯一设备 ID

    我正在制作一个带有基于令牌的系统的应用程序 因此 用户可以购买代币并使用它们进行一些操作 使用电子邮件和密码创建帐户后 每个用户免费获得 10 个代币 作为试用版 我想防止该用户每次都获得一个新帐户来获得另外 10 个令牌 我想知道 And
  • 如何注入ApplicationContext本身

    我想注射一个ApplicationContext本身就是一颗豆子 就像是 public void setApplicationContext ApplicationContect context this context context 春
  • 如何在 bash 中构建条件赋值?

    我正在寻找一种在 bash 中构建条件分配的方法 在 Java 中它看起来像这样 int variable condition 1 0 如果您想要一种在 shell 脚本中定义默认值的方法 请使用如下代码 VAR default 是的 该行
  • Docker compose 指定镜像与 Dockerfile

    我是新来的docker compose阅读完文档后 我仍然有一些不清楚的事情浮现在我的脑海中 到目前为止 当我使用 docker 时 我将构建保存在以下目录树中 builds Service A Dockerfile ServiceA ja
  • 如何使用OpenGL模拟OpenCV的warpPerspective功能(透视变换)

    我在 Python 和 C 中使用 OpenCV 完成了图像变形 看到可口可乐徽标在我选择的角落变形 使用以下图像 和这个 完整专辑 包含过渡图片和说明 https i stack imgur com 40pdD jpg 我确实需要这样做
  • ASP.NET Identity EF 中的动态用户声明

    我正在开发一个使用 ASP NET Identity 和 Entity Framework 的身份验证系统 并且我希望有一些声明是计算值 而不是硬编码到声明表中 当用户登录时 如何将动态声明添加到该登录会话而不实际将其添加到声明表中 例如
  • Hadoop put 命令抛出 - 只能复制到 0 个节点,而不是 1 个

    我是 Hadoop 新手 我正在尝试在我的 ubuntu 机器上进行伪分布式模式设置 并面临以下问题hadoop put命令 我的配置详细信息可以在这篇文章中找到 gt 命令 hadoop namenode format 会做什么 http
  • 使用 Gulp Notify 和 Plumber 的全局错误消息

    是否可以创建一个全局 OnError 函数 我可以将标题和错误消息传递给该函数 我希望对与管道工一起运行的所有任务执行类似的操作 onError function error notify onError title Error subti
  • PhoneGap 应用程序被拒绝 10.6

    我们的 PhoneGap 应用程序刚刚被拒绝 二进制被拒绝 10 6 Apple 和我们的客户高度重视简单 精致 有创意 经过深思熟虑的界面 他们需要更多的工作 但 值得 苹果设定了很高的标准 如果您的用户界面很复杂或者 不太好 可能会被拒
  • 如何在 Eclipse 中为托管 ARM C 项目添加单元测试?

    我有一个托管 Eclipse 项目 它使用 GNU ARM 嵌入式工具链为 ST 微控制器进行编译 我现在想做的是 对该项目中的代码进行单元测试 我想用于单元测试的框架是Google Test 我尝试为单元测试创 建第二个 Eclipse
  • C++ for-each 语句触发“向量迭代器不兼容”断言失败:this->_Getcont() == 0

    这是使用 Visual Studio 2012 static void func const std vector
  • Oracle 数据更改通知超时和工作流程

    美好时光 我们在 Java 应用程序中配置了 Oracle DCN 功能 一切工作正常 但应用程序关闭时出现一些问题 如果应用程序意外关闭 例如 tomcat 进程通过kill 9命令 DCN 订阅者被挂在数据库中 select from