繁体   English   中英

如何将连接池与 Hazelcast jet JDBC 一起使用?

[英]How to use Connection Pooling with Hazelcast jet JDBC?

我正在尝试将连接池与 hazelcast jet jdbc 一起使用,但它不允许我这样做。 我有从中获取连接的数据源 bean,但它不起作用。 这是我的代码:

Connection conn = ((DataSource)Ds.getBean("dataSourceName").getConnection();
BatchSource<Object> jdbcSource = Sources
                .jdbc(() -> conn,
                    (con, parallelism, index) -> {
                       // query execution
               }, r -> this.mapResultSet1(r, metaData));

但是当我执行它给我以下错误:

java.lang.IllegalArgumentException: "newConnectionFn" must be serializable
at com.hazelcast.jet.impl.util.Util.checkSerializable(Util.java:203)
at com.hazelcast.jet.impl.connector.ReadJdbcP.supplier(ReadJdbcP.java:77)
at com.hazelcast.jet.core.processor.SourceProcessors.readJdbcP(SourceProcessors.java:433)
at com.hazelcast.jet.pipeline.Sources.jdbc(Sources.java:1327)
at com.aivdata.impl.JDBCDataSource.readSource(JDBCDataSource.java:70)
at com.aivdata.services.AivDataFactory.lambda$1(AivDataFactory.java:123)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
Caused by: java.io.NotSerializableException: org.apache.tomcat.dbcp.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at com.hazelcast.jet.impl.util.Util.checkSerializable(Util.java:201)

如何通过 Hazelcast jet 使用连接池来实现这一点?

异常告诉您以下函数不可序列化:

() -> conn

相反,您应该使用类似于以下内容的内容:

() -> DriverManager.getConnection(dbConnectionUrl)

JDBC 源使用提供的函数为每个处理器实例创建一个连接——这意味着它将在每个集群成员上创建n连接,其中n等于 JDBC 源的本地并行度。 本地并行度的默认值为 1。您可以通过在 JDBC 源上调用com.hazelcast.jet.pipeline.BatchStage#setLocalParallelism来修改此值。

如果您的作业是一次性批处理作业或长时间运行的批处理作业,则使用连接池没有意义。

如果您执行一个作业的许多小实例,那么使用连接池可能是有意义的,在这种情况下,为每个作业执行创建一个连接会导致过多的开销。 在这种情况下,您需要通过可序列化的newConnectionFn函数使您的连接池实例可用,例如通过使其成为静态字段中的单例,延迟初始化。

如果我在 Source Jdbc 内部建立连接但不确定它是使用池化还是创建新的,这对我有用。

BatchSource<Object> jdbcSource = Sources
                .jdbc(() -> {
                      Connection conn = ((DataSource)Ds.getBean("dataSourceName").getConnection();
                      return conn;
                  },
                    (con, parallelism, index) -> {
                       // query execution
               }, r -> this.mapResultSet1(r, metaData));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM