如何在Liberty Batch(JSR 352)ItemWriter中使用SQLJ进行数据库更新?

时间:2017-11-10 15:23:03

标签: websphere-liberty jsr352 java-batch

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

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

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

1 个答案:

答案 0 :(得分:0)

推荐的方法通常是在每个块中运行的 writeItems()方法中对SQLJ使用get-use-close模式。这比在打开()中获取连接/上下文以及跨块的缓存更受青睐。

您可以使用 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 属性配置您的dataSource(这增加了此处不需要的灵活性,并打开了与连接缓存相关的更复杂问题的大门)。

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