【问题标题】:Java Streaming JDBC resultset to read rows from a table keeping resultset open and without firing SQL againJava Streaming JDBC 结果集从保持结果集打开且无需再次触发 SQL 的表中读取行
【发布时间】:2015-09-08 21:51:33
【问题描述】:

我们有一个场景,我们不断地从表中读取数据,而另一个应用程序正在向该表中插入记录。根据我们当前的实现,我们在一段时间后使用 Spring 的 JdbcTemplate 轮询(在该表上执行 SQL)新记录。

我正在考虑通过某种方式实现流式 ResultSet,这样我就可以继续从 ResultSet 读取表数据,而无需一次又一次地执行 SQL。

编辑:从当前实现中添加代码 sn-p:

String SQL = "SELECT * FROM ACTIONSTATUS WHERE STATUS = 'FAILED' and ALERTID > :alertId";

public static void fetchActionStatus(NamedParameterJdbcTemplate template, HashMap<String, String> paramMap, String fetchSql) throws Exception{
    int i = 0;
    List<Map<String, Object>> results = null;
    while(true){
        if(results == null || results.size() == i){
            results = template.queryForList(SQL, paramMap);
            i = 0;
        }else{
            Map<String, Object> row = results.get(i);

            // SOME DATA PROCESSING WHICH MAY TAKE XX MILISEC.
            System.out.println("ALERTID:     " + row.get("ALERTID").toString() + "     ACTIONID:     " + row.get("ACTIONID").toString() + "     STATUS:     " +row.get("STATUS").toString());
            Thread.sleep(100);
            paramMap.put("alertId", row.get("ALERTID").toString());
            i++;
        }
    }

}

其他一些应用程序在 ACTIONSTATUS 表中随机插入新记录,我们需要持续监控 ACTIONSTATUS 表以处理所有记录。我们当前的实现运行良好,没有任何问题。我们正在寻找其他解决方案来优化这种方法,以某种方式流式传输 ResultSet 而无需一次又一次地执行 SQL。

【问题讨论】:

  • 向我们展示你到目前为止所做的事情..
  • 这似乎不是正确的设计,为什么不将数据流式传输给工作人员,一旦处理完毕,它就会保存到表中?
  • @Bond-JavaBond 感谢您的回复,我刚刚为我的问题添加了更多详细信息。你能建议我另一种获取数据的方法吗?
  • @prmottajr 我们无法控制其他应用程序。
  • 在 Oracle 中,您将为此使用 AQ...“不幸的是”,目前 SQL Server 中没有等效功能。

标签: java sql-server-2008 jdbc spring-jdbc


【解决方案1】:

我认为 JDBC 没有办法做到这一点。

从 SQL 的角度来看,由于事务隔离的问题,它可能存在问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2015-07-26
    • 2020-07-24
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    相关资源
    最近更新 更多