Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java锅炉板代码:连接管理_Java_Connection Pooling_Meta - Fatal编程技术网

Java锅炉板代码:连接管理

Java锅炉板代码:连接管理,java,connection-pooling,meta,Java,Connection Pooling,Meta,处理连接池时,我们通常有以下代码: 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);

处理连接池时,我们通常有以下代码:

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中有更好的方法吗?

使用Spring用于的回调模式

接口PooledConnectionCallback{
T销接头(接头c);
}
池池=新池(池参数);
整数returnedValue=pool.execute(
新建PooledConnectionCallback(){
公共整数连接(连接c){
int someReturnValue=使用连接的业务逻辑(c);
返回返回值;
}});

在<代码>池>执行< /代码>方法中,您可以拥有处理异常和清理所需的样板代码。

如果使用Spring,请考虑使用JDCB模板或NAMEDATABAREDJBCTMAPTIO:

即使不使用Spring,也可以使用相同的基本模板方法模式。只需谷歌“模板方法”。有很多关于它的文章。

什么是池#执行签名?
T池#执行(PooledConnectionCallback)
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;
    }});