问题描述
我是 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
如果可能,请帮我解决这个问题。
解决方法
我假设“命名 JDBC 查询”是指“命名参数”。
它不是 JDBC API 的标准特性,它是 Spring Framework 提供的一种便利。 Hazelcast Jet 不支持它。我们目前正在研究如何在 Hazelcast Jet 和 Spring 之间提供更好的集成,这是我们关注的事情之一。
,我将回答问题的另一部分:从技术上讲,创建 ResultSet
源是不可能的。查询必须在集群上执行,您不能在客户端执行查询并将其发送到集群以获取行。这就是为什么 JDBC 源要求您提供 SQL 语句和 lambda 来创建连接,但连接将在集群中创建并用于执行查询。