我应该如何在 Liberty Batch (JSR 352) ItemWriter 中使用 SQLJ 进行数据库更新?
How should I do a DB update using SQLJ in a Liberty Batch (JSR 352) ItemWriter?
我应该如何 obtain/cache/close 我的 ConnectionContext(连接)?
我是否应该在 ItemWriter.open() 中缓存上下文并在每个块的 ItemWriter.writeItems() 中缓存
如果我想使用特定于 DB2 的 API 怎么办?
推荐的方法通常是在每个块的 writeItems() 方法 运行 中对 SQLJ 使用获取-使用-关闭模式。这优于在 open() 中获取 connection/context 并跨块缓存。
您可以使用 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 中的获取-使用-关闭模式的一般建议。让 WebSphere 做连接池提供了良好的性能、更好的资源利用率并避免了一些更复杂的池场景。
我应该如何 obtain/cache/close 我的 ConnectionContext(连接)?
我是否应该在 ItemWriter.open() 中缓存上下文并在每个块的 ItemWriter.writeItems() 中缓存
如果我想使用特定于 DB2 的 API 怎么办?
推荐的方法通常是在每个块的 writeItems() 方法 运行 中对 SQLJ 使用获取-使用-关闭模式。这优于在 open() 中获取 connection/context 并跨块缓存。
您可以使用 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 中的获取-使用-关闭模式的一般建议。让 WebSphere 做连接池提供了良好的性能、更好的资源利用率并避免了一些更复杂的池场景。