java - 如何在使用 Java 读取和处理数据库记录时进行异步消息传递

标签 java eclipse hibernate plsql connection-pooling

这里我有线程池和另一个轮询类,用于实现轮询和从数据库读取消息。现在的问题是我必须避免读取冗余消息来更新和处理同时等待的其他消息,因为有大量消息在等待。

// the code for poll method
public void poll() throws Exception {
    // Method which defines polling of the data entry for counting its size.
    st = conn.createStatement();
    int count = 1;
    long waitInMillisec = 1 * 60 * 125; // Wait for 7.5 seconds.
    for (int i = 0; i < count; i++) {
        System.out.println("Wait for " + waitInMillisec + " millisec");
        Thread.sleep(waitInMillisec);

        java.util.Date date = new java.util.Date();
        Timestamp start = new Timestamp(date.getTime());
        rs = st.executeQuery("select * from msg_new_to_bde where ACTION=804");
        java.util.Date date1 = new java.util.Date();
        Timestamp end = new Timestamp(date1.getTime());
        System.out.print("Query count: ");
        System.out.println(end.getTime() - start.getTime());

        Collection<KpiMessage> pojoCol = new ArrayList<KpiMessage>();
        while (rs.next()) {
            KpiMessage filedClass = convertRecordsetToPojo(rs);
            pojoCol.add(filedClass);

        }

最佳答案

我不知道您是否可以选择如何存储您的消息,但它们似乎被插入到您正在轮询的表中。您可以向该表添加一个数据库触发器,该触发器反过来将一条消息推送到具有相同数据和相关 ID 的 Oracle AQ。

如果您可以不用表,我建议只在相同的模式中定义 Oracle AQ 来存储消息,并使用模式匹配(如 corrid="804%")按部分相关 ID 出列。 AQ 消息的完整关联 ID 可能是“804”+ 消息的唯一 pk。例如,您可以为多个操作重用同一个队列,并定义一个 Java 队列 804 操作工作类来等待该特定操作的消息(AQ 消息上的 804 关联 ID 前缀)。

Oracle for AQ 的文档非常好,您用来创建队列的包是 dbms_aqadm。用于入队/出队的包是 dbms_aq。在创建 aq 和使用 dbms_aq 包之前,您还需要获得一些特权/授权。应该可以轻松地从 Java 调用 dbms_aq。

转到 docs.oracle.com 以查找有关 dbms_aqadm 和 dbms_aq 包的详细信息。一旦您创建了 AQ(这将创建一个支持队列的 AQ 表),我建议您在 corrid 上为 AQ 表添加一个索引以提高性能。

如果您无法避免现有的当前表架构或不想使用 AQ 技术,您可以使用的另一个选项是在 Oracle(dbms_lock 包)中创建一个锁并在您的轮询类以获得锁或阻塞/等待。这样您就可以同步所有轮询类以避免多个线程获取相同的消息。所以轮询类要做的第一件事就是尝试获取锁,如果成功,它会从表中拉出一条消息,处理它,在处理后更新它,释放锁。 dbms_lock 包可以阻止/等待锁定或立即返回,但基于操作成功/失败,您可以采取进一步的行动。但它会帮助您控制线程接收相同的消息。 Oracle 的文档也很好地介绍了这个包。

关于java - 如何在使用 Java 读取和处理数据库记录时进行异步消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13816567/

相关文章:

java - Maven Spring 启动 :run against compiled jar

java - 使用 FileReader 的 java 中的这段代码有什么问题?

java - 使用外部 Jar 文件中的 Main 方法从项目构建可运行的 Jar

java - 如何在 Lucene 3.0.1 中索引 BigDecimal 值

java - 将gradle项目导入另一个插件时出错

android - 如何禁用ADT图形布局编辑器?

java - 在 osgi 插件中引用本地文件夹

hibernate - Hibernate 中的自引用一对一映射

java - 如何使用hibernate注释+ Spring MVC映射两个表(一对多)

java - Hibernate 标准,两个实体