【发布时间】:2021-05-08 12:55:28
【问题描述】:
我是 Hazelcast Jet 的新手,我正在使用 Spring JdbcTemplate 执行我的查询,该查询在查询中使用命名参数,但我不确定如何将它与 Hazelcast Jet 一起使用。
例如Hazelcast 的工作方式如下:
Pipeline p = Pipeline.create();
p.readFrom(Sources.jdbc(
() -> DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql"),
(con, parallelism, index) -> {
PreparedStatement stmt = con.prepareStatement(
"SELECT * FROM person WHERE MOD(id, ?) = ?)");
stmt.setInt(1, parallelism);
stmt.setInt(2, index);
return stmt.executeQuery();
},
resultSet -> new Person(resultSet.getInt(1), resultSet.getString(2))
)).writeTo(Sinks.logger());
但是,我想使用 SELECT * FROM person WHERE MOD(id, :id) = :id) 之类的命名查询,而不是 ?。 Hazelcast 是否支持命名查询或 Spring JdbcTemplate?
同样在Sources,我们可以直接传递ResultSet作为源吗?有很多来源,但我没有找到“ResultSet”的任何来源。
例如
p.readFrom(Sources.resultSet(<Resultset Object>) //something like this
如果可能的话,请帮我解决这个问题。
【问题讨论】:
-
您能否澄清一下您的意思:“[...] 我们可以将结果集直接作为源传递吗?” ?你想达到什么目的?
-
在我的应用程序中,我使用的是 Spring JdbcTemplate,它返回了我的结果集,我想使用 hazelcast jet 管道对其进行一些过滤、聚合和分组,那么我怎样才能像 Hazelcast jet 那样直接实现它不支持将结果集作为源或命名参数。
-
没有用于此的 API。主要原因:整个结果集必须在提交管道作业的实例的内存中实现。通常 ResultSet 连接到底层数据库。您可以创建一个不连贯的表示:它称为 RowSet。但是您必须在内存中具体化整个数据集。这可能适用于玩具示例,但对于任何有意义的数据大小来说并不实用。
-
您使用 JdbcTemplate 的动机是什么?您想要/需要使用命名参数吗?还是Spring管理的连接池?我们目前正在研究如何改进我们的 Spring 集成,您的示例可以帮助您更好地理解问题。
-
是的,我们的连接池由 spring 管理,我们的整个应用程序建立在 JDBCTemaple 作为数据库连接,查询和参数一切都是动态的,将由用户编写(因此用户不必再次编写参数或数一下),因为查询也可以是 200、300 或更多行,这就像创建动态数据集(BI 报告),我可以从 JDBCTemplate 实现 List(可以与 Hazelcast Sources 一起使用),但它会也存储在内存中,这不是一个好主意。
标签: java hazelcast hazelcast-jet