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

在使用Java读取和处理数据库记录时,如何执行异步消息传递,java,eclipse,hibernate,plsql,connection-pooling,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();

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

// 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);

        }
//轮询方法的代码
public void poll()引发异常{
//方法,该方法定义数据项的轮询以计算其大小。
st=conn.createStatement();
整数计数=1;
长等待毫秒=1*60*125;//等待7.5秒。
for(int i=0;i
我不知道您是否可以选择消息的存储方式,但它们似乎被插入到您正在轮询的表中。您可以在此表中添加一个数据库触发器,然后将消息推送到具有相同数据和相关id的Oracle AQ中

如果您可以不使用该表,我建议只在同一模式中定义Oracle AQ来存储消息,并使用模式匹配(如corrid=“804%”)通过部分相关id退出队列。AQ消息的完整相关id可能是“804”+消息的唯一pk。例如,您可以将此相同队列重新用于多个操作,并定义Java queue 804 action worker类以等待该特定操作的消息(AQ消息上的804 correlation id前缀)

Oracle for AQ的文档非常好,用于创建队列的包是dbms_aqadm。用于排队/退队的包是dbms_AQ。在创建AQ和使用dbms_AQ包之前,还需要获得一些特权/授权。dbms_AQ应该很容易从Java调用

请访问docs.oracle.com以查找有关dbms_aqadm和dbms_aq包的详细信息。创建aq(将创建支持队列的aq表)后,我建议您在corrid上为aq表添加索引以提高性能


如果您无法避免现有的表体系结构,或者不想使用AQ技术,那么您可以使用的另一个选项是在Oracle中创建锁(dbms_lock package)并在轮询类中调用它以获取锁或阻塞/等待。通过这种方式,您可以同步所有轮询类,以避免多个线程拾取同一消息。因此,轮询类要做的第一件事是尝试获取锁,如果成功,它将从表中提取消息,对其进行处理,并在处理后对其进行更新,释放锁。dbms_lock包可以阻止/等待锁或立即返回,但根据操作的成功/失败,您可以采取进一步的操作。但它将帮助您控制线程拾取相同的消息。Oracle的文档在这个包上也非常好。

请看JMS谢谢,但异步需要什么在数据库中传递ous消息经常轮询数据库通常是一个坏主意。请查看使用触发器和oracle高级队列以获得异步支持。不确定是否有java接口,或者是否只有PL/SQL。请尝试此示例