ListenableFutureTask<List<T>> task = ListenableFutureTask.create(new Callable<List<T>>() {
@Override
public List<T> call() throws Exception{
List<ListenableFuture<List<T>>> = new ArrayList<>();
futures.add(function);
List<T> result = new List<T>;
result.addAll(future.get());
return result;
}
});
service.execute(task);
public ListenableFuture<List<T>> funtion(param, values){
PreparedStatement preStmt;
Statement stmt = preStmt.bind(param, values);
return Futures.transform(query(session, statement, new Semaphore(readAsyncNum)),
rows -> {
Result<T> mapResults = mapper.get(rows);
List<T> results = new ArrayList<>();
for(T t : mapResults){
if(result.getAvailableWithoutFetching() == int && !result.isFullyFetched()){
mapResults.fetchMoreResults();
}
t.setColumnValue();
...
results.add(t);
}
return results;
}, executor);
}
ResultSetFuture query(Session session, Statement statement, Semaphore semaphore){
semaphore.acquireUninterruptibly();
ResultSetFuture future = session.executeAsync(statement);
Futures.addCallback(future, new FutureCallBack<ResultSet>() {
@Override
public void onSuccess(ResultSet rows) {semaphore.release();}
@Override
public void onFailure(Throwable throwable) {semaphore.release();}
}, MoreExecutors.directExecutor());
return future;
}
Statement
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。 有三种 Statement 对象,它们都作为在给定连接上执行 SQL 语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和 CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句: Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存在的存储过程的调用。 简单来收,Statement 接口提供了执行语句和获取结果的基本方法。PreparedStatement 接口添加了处理 IN 参数的方法;而 CallableStatement 添加了处理 OUT 参数的方法。 在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。
|