java - NiFi定制处理器-读取数据库 View

标签 java apache-nifi psql

我是 NiFi 新手,正在开发一个自定义处理器,以从 psql 数据库 View 中提取最新数据。当自定义处理器初始化时,我可以使用下面的代码检索数据库 View 。

private void GetData(){
    Connection connection = DriverManager.getConnection("jdbc:postgresql://example:5432/example", "user", "pass");
    Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    ResultSet rs = statement.executeQuery("SELECT * FROM Example_Table");
    while(rs.next()){
        //Get data from database
    }
    connection.close();
}

但是我正在努力从数据库 View 中获取最新更新。主要问题是何时将新条目添加到数据库中。由于处理器初始化时会查询数据库,因此自定义处理器不会有新条目。

我尝试在 public void onTrigger() 函数中实现查询;然而,这将导致管道备份,因为它将查询每个流文件的数据库(如果每秒有数千个流文件进入,这并不理想)。

是否有一种方法可以在处理器启动时查询数据库?无需查询每个流程文件的数据库?或者,是否可以检测数据库是否已被修改并在修改时提取数据?或者甚至设置一个计时器来在自定义处理器中提取数据库?

非常感谢您的帮助,提前谢谢您。

最佳答案

我认为,如果您能更多地解释一下您的更高级别的用例,它可能会帮助您获得解决方案,因为这似乎是一种不常见的方法。通常每个处理器都有一个单一的职责,因此一些处理器与数据库交互,然后输出必要的信息供其他处理器使用。

有一些LookupService这可能是值得检查的好例子,例如 MongoDBLookupService

如果您的用例实际上是“我有一个自定义处理器,它摄取包含任意数据的流文件,并且需要使用此数据库表中的最新数据对它们执行一些操作”,您有几个选择:

  1. 按照上面的方法执行数据库查询,并在 onEnabled() 期间调用该方法一次从表中获取大部分数据,然后使用线程定期调用它以保持更新并将结果存储在本地字段中。当 onTrigger()方法运行时,使用本地缓存结果而不是进行数据库调用。这将减少延迟并为您提供近乎实时的数据。请务必通过 @OnStopped 的方法清理线程运行程序和本地状态。注解。
  2. 执行与流程文件处理内联的数据库查询(即 onTrigger() )。这可能会导致高延迟和吞吐量阻塞。如果能够使用List<FlowFile> flowfiles = session.get(1000);进行批处理,您可以增加每个执行周期中处理的流文件的数量。 (数量可配置)。
  3. 如果没有更新插入/就地修改(即对数据库表的任何更改都会导致行),您可以使用哨兵查询 ( SELECT COUNT(*) FROM table; ) 返回数字行,将其与先前返回的行数进行比较,并且仅在这些数字不同时才执行检索所有数据的“昂贵”查询。在这种情况下,您可以通过记录先前获取的行的最大 ID 或时间戳来检索增量行。如果可以更新插入,类似于 SELECT MAX(lastModified) AS mostRecentTimeModified FROM table;可能会有帮助。

关于java - NiFi定制处理器-读取数据库 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56502241/

相关文章:

java - 在基于 Java 的 Web 服务中使用代理获取网页

sql - 能够在命令行中创建 postgres 数据库,但不能在 bash 脚本中创建

Postgresql 没有以 “createdb” 作为 super 用户创建数据库,但没有输出错误

java - 选择Factory Method模式来实现ExecutorService的设计动机是什么?

java - 将一个日期字段分配给另一日期字段

docker - Apache NIFI请求包含无效的主机头

apache-nifi - Nifi(HDF)中的 Multi-Tenancy ?

rest - Apache Nifi : use OAuth 2. 0 访问 Google Analytics API

php - Response 内容必须是实现 __toString() 的字符串或对象,移动到 psql 后给出的 "boolean"

java - 如何使 JavaFX 上下文菜单中的 MenuItems 支持 onMouseOver 事件