public static DataSource setupDataSource(String connectURI) {
    //
    // First, we'll create a ConnectionFactory that the
    // pool will use to create Connections.
    // We'll use the DriverManagerConnectionFactory,
    // using the connect string passed in the command line
    // arguments.
    //
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI, null);

    //
    // Next we'll create the PoolableConnectionFactory, which wraps
    // the "real" Connections created by the ConnectionFactory with
    // the classes that implement the pooling functionality.
    //
    PoolableConnectionFactory poolableConnectionFactory =
        new PoolableConnectionFactory(connectionFactory, null);

    //
    // Now we'll need a ObjectPool that serves as the
    // actual pool of connections.
    //
    // We'll use a GenericObjectPool instance, although
    // any ObjectPool implementation will suffice.
    //
    ObjectPool<PoolableConnection> connectionPool =
        new GenericObjectPool<>(poolableConnectionFactory);

    // Set the factory's pool property to the owning pool
    poolableConnectionFactory.setPool(connectionPool);

    //
    // Finally, we create the PoolingDriver itself,
    // passing in the object pool we created.
    //
    PoolingDataSource<PoolableConnection> dataSource = new PoolingDataSource<>(connectionPool);

    return dataSource;
  }
 @Override
 public DataSource create(DataSourceFactory dsf, Properties props) throws SQLException {
   try {
     DataSource ds = dsf.createDataSource(getNonPoolProps(props));
     DataSourceConnectionFactory connFactory = new DataSourceConnectionFactory((DataSource) ds);
     PoolableConnectionFactory pcf = new PoolableConnectionFactory(connFactory, null);
     GenericObjectPoolConfig conf = new GenericObjectPoolConfig();
     BeanConfig.configure(conf, getPoolProps(props));
     BeanConfig.configure(pcf, getPrefixed(props, FACTORY_PREFIX));
     GenericObjectPool<PoolableConnection> pool =
         new GenericObjectPool<PoolableConnection>(pcf, conf);
     pcf.setPool(pool);
     return new PoolingDataSource<PoolableConnection>(pool);
   } catch (Throwable e) {
     LOG.error("Error creating pooled datasource" + e.getMessage(), e);
     if (e instanceof SQLException) {
       throw (SQLException) e;
     } else if (e instanceof RuntimeException) {
       throw (RuntimeException) e;
     } else {
       throw new RuntimeException(e.getMessage(), e);
     }
   }
 }
 /**
  * Creates the PoolableConnectionFactory and attaches it to the connection pool.
  *
  * @param driverConnectionFactory JDBC connection factory created by {@link
  *     #createConnectionFactory()}
  * @throws SQLException if an error occurs creating the PoolableConnectionFactory
  */
 @Override
 protected PoolableConnectionFactory createPoolableConnectionFactory(
     ConnectionFactory driverConnectionFactory) throws SQLException {
   PoolableConnectionFactory connectionFactory = null;
   try {
     connectionFactory =
         new PoolableManagedConnectionFactory(
             (XAConnectionFactory) driverConnectionFactory, getRegisteredJmxName());
     connectionFactory.setValidationQuery(getValidationQuery());
     connectionFactory.setValidationQueryTimeout(getValidationQueryTimeout());
     connectionFactory.setConnectionInitSql(getConnectionInitSqls());
     connectionFactory.setDefaultReadOnly(getDefaultReadOnly());
     connectionFactory.setDefaultAutoCommit(getDefaultAutoCommit());
     connectionFactory.setDefaultTransactionIsolation(getDefaultTransactionIsolation());
     connectionFactory.setDefaultCatalog(getDefaultCatalog());
     connectionFactory.setCacheState(getCacheState());
     connectionFactory.setPoolStatements(isPoolPreparedStatements());
     connectionFactory.setMaxOpenPrepatedStatements(getMaxOpenPreparedStatements());
     connectionFactory.setMaxConnLifetimeMillis(getMaxConnLifetimeMillis());
     connectionFactory.setRollbackOnReturn(getRollbackOnReturn());
     connectionFactory.setEnableAutoCommitOnReturn(getEnableAutoCommitOnReturn());
     connectionFactory.setDefaultQueryTimeout(getDefaultQueryTimeout());
     connectionFactory.setFastFailValidation(getFastFailValidation());
     connectionFactory.setDisconnectionSqlCodes(getDisconnectionSqlCodes());
     validateConnectionFactory(connectionFactory);
   } catch (RuntimeException e) {
     throw e;
   } catch (Exception e) {
     throw new SQLException("Cannot create PoolableConnectionFactory (" + e.getMessage() + ")", e);
   }
   return connectionFactory;
 }