0

我应该如何获取/缓存/关闭我的ConnectionContext(连接)?

我是否应该在ItemWriter.open()中缓存上下文并在每个块的ItemWriter.writeItems()中缓存

如果我想使用特定于 DB2 的 API 怎么办?

4

1 回答 1

0

推荐的方法通常是在每个块中运行的writeItems()方法中为 SQLJ 使用 get-use-close 模式。这比在open()中获取连接/上下文和跨块缓存更可取。

您可以使用Connection.unwrap()方法进行特定于 JDBC 驱动程序的调用。

所以像:

public class MyDB2SQLJItemWriter implements ItemWriter {

    DataSource myDataSource; // get via injection (not shown) or however

    // ...

    public void writeItems(List<Object items) throws Exception {

        Connection con = myDataSource.getConnection();
        DB2Connection db2Con = con.unwrap(DB2Connection.class);
        db2Con.setPackagePath(currentPackagePath);  // DB2-specific call
        SqljCtx sqljCtx = new SqljCtx(db2Con);

        // now do SQLJ

        // close SqljCtx AND DB2Connection
        sqljCtx.close();
    }

也无需使用enableConnectionCasting属性配置您的数据源(这增加了此处不需要的灵活性,并为与连接缓存相关的更复杂问题打开了大门)。

此建议扩展了一般建议,以在使用 JDBC API 时遵循 WebSphere 中的 get-use-close 模式。让 WebSphere 做连接池提供了良好的性能、更好的资源利用率并避免了一些更复杂的池场景。

于 2017-11-10T15:23:02.953 回答