在处理连接池时,我们通常会有以下代码:
connection c = pool.borrow();
try {
business-logic-using-connection(c);
}
catch(connectionException e) {
connectionBad = true;
}
finally{
if (connectionBad) {
pool.evict(c);
} else {
pool.return(c);
}
}
问题是如何使这个锅炉板代码更简单,以便人们可以做类似的事情:
getConnectionAndDoWork(pool, business-logic-code)
其中一个人可以插入他们的业务逻辑,而不必在整个地方重复相同的连接管理代码。一种方法是为业务逻辑代码创建一个接口,例如doWorkWithConnection
,它接受连接并做一些工作。但是,这限制了业务逻辑代码应返回的内容;
在Java中有更好的方法吗?
答案 0 :(得分:2)
使用Spring用于programmatic transaction management的回调模式。
interface PooledConnectionCallback<T> {
T doWithConnection(Connection c);
}
Pool pool = new Pool(poolParams);
Integer returnedValue = pool.execute(
new PooledConnectionCallback<Integer>() {
public Integer doWithConnection(Connection c) {
int someReturnValue = businessLogicUsingConnection(c);
return someReturnValue;
}});
在Pool#execute
方法中,您可以获得处理异常和清理所需的样板代码。
答案 1 :(得分:0)
如果您使用的是Spring,请考虑使用JdbcTemplate或NamedParameterJdbcTemplate:
即使您没有使用Spring,您仍然可以使用相同的基本模板方法模式。只是谷歌“模板方法”。有很多关于它的文章。