不断从MYSQL表中获取内容

时间:2017-06-12 07:11:32

标签: java mysql sql activemq

我在这里有一个代码。我的代码用于在表上获取每一行的内容(int)并将其连续发送到ActiveMQ。当表更新时,新行的内容将被发送到ActiveMQ。

但是当我停止进程并再次重新运行时,它会将所有内容从第0行发送到ActiveMQ。我希望我可以继续发送以前没有发送的内容,并且像往常一样正常工作......

我认为我必须创建一个新的db表来保存循环中的每个最后限制(行计数),所以我可以在进程停止时再次使用它。有什么帮助吗?

else if(vardbtype.equals("MYSQL")){
      Class.forName("com.mysql.jdbc.Driver");
      System.out.println("----------------------------");
      int limitrowmysql = 0;
      Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+ vardbserver, vardbuser, vardbpassword);
      while(true) {
          Statement stmts = c.createStatement();
          int countrowmysql = 0;
          String sql = ("SELECT * FROM "+ vardbname +" LIMIT "+ limitrowmysql +", 18446744073709551615");
          ResultSet rss = stmts.executeQuery(sql);
          while(rss.next()) {
              String  message = rss.getString("MESSAGE");
              System.out.println("Message = " + message);
              TextMessage mssg = session.createTextMessage(message);
              System.out.println("Sent: " + mssg.getText());
              producer.send(mssg);
              countrowmysql = countrowmysql + 1;
          }
          rss.close();
          stmts.close();

          limitrowmysql = limitrowmysql + countrowmysql;
          Thread.sleep(batchperiod2);
      }
}

2 个答案:

答案 0 :(得分:1)

正确,你需要自己处理最后看到的id,或者利用一个为你处理这个问题的框架。

仅供参考 - 您正在寻找的模式通常被称为" Polling Consumer"。 Apache Camel具有自动处理此方案的代码。

答案 1 :(得分:0)

就我的意见而言,维护新表以保存“行计数”并不能解决您的问题。考虑当进程停止并且任何行已被其他用户删除/更新时的情况(如果是多用户应用程序),存储“行计数”将无法帮助您。

事实上,您应该依赖轮询机制(直接RMI / API /方法调用)在进程启动时一次性从数据库中获取所有记录,并遵循通知机制(ActiveMQ)从此以后正如您所做的那样,桌面上的每一次更新都会发生。