Skip to content

Instantly share code, notes, and snippets.

@mgodave
Created July 15, 2012 18:55
Show Gist options
  • Save mgodave/3118159 to your computer and use it in GitHub Desktop.
Save mgodave/3118159 to your computer and use it in GitHub Desktop.
import com.google.common.util.concurrent.*;
import org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS;
import org.apache.commons.dbcp.datasources.SharedPoolDataSource;
import org.apache.commons.dbutils.AsyncQueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.ThreadPoolExecutor;
import static com.google.common.base.Throwables.propagate;
import static com.google.common.util.concurrent.Futures.addCallback;
import static com.google.common.util.concurrent.MoreExecutors.getExitingExecutorService;
import static com.google.common.util.concurrent.MoreExecutors.listeningDecorator;
import static java.util.concurrent.Executors.newCachedThreadPool;
public class AsyncDB {
public static void main(String[] args) {
try {
final DriverAdapterCPDS adapter = new DriverAdapterCPDS();
adapter.setDriver("org.hsqldb.jdbc.JDBCDriver");
adapter.setUrl("jdbc:hsqldb:mem:mymemdb");
adapter.setUser("SA");
adapter.setPassword(null);
final SharedPoolDataSource datasource = new SharedPoolDataSource();
datasource.setConnectionPoolDataSource(adapter);
datasource.setMaxActive(10);
datasource.setMaxWait(50);
datasource.getConnection().createStatement().execute("create table users(name varchar(256))");
final ListeningExecutorService executor =
listeningDecorator(
getExitingExecutorService(
(ThreadPoolExecutor) newCachedThreadPool()));
final AsyncQueryRunner runner = new AsyncQueryRunner(datasource, executor);
final ListenableFuture<Integer> future =
(ListenableFuture<Integer>) runner.query(
"select count(*) from users",
new ResultSetHandler<Integer>() {
@Override
public Integer handle(ResultSet resultSet) throws SQLException {
while (resultSet.next()) {
return resultSet.getInt(1);
}
return 0;
}
});
addCallback(future, new FutureCallback<Integer>() {
@Override
public void onSuccess(Integer userCount) {
System.out.println("There are " + userCount + " users");
}
@Override
public void onFailure(Throwable throwable) {
propagate(throwable);
}
});
} catch (Throwable e) {
propagate(e);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment