Android Open Source - DKO Single Threaded Data Source






From Project

Back to project page DKO.

License

The source code is released under:

GNU Lesser General Public License

If you think the Android project DKO listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.kered.dko.datasource;
/*from   w  w  w  . j a v  a  2  s  . c  o m*/
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Logger;

import javax.sql.DataSource;

/**
 * This DataSource wraps another while enforcing a single threaded access model.
 * A new connection cannot be opened until the previously granted connection has been closed.
 * New calls to {@code getConnection()} will block until a timeout has been reached (at
 * which point a null is returned).
 * This is highly recommended as a wrapper around SQLite3 backed DataSources, as it cannot
 * handle multiple simultaneous connections.
 *
 * @author Derek Anderson
 */
public class SingleThreadedDataSource implements MatryoshkaDataSource {

  private final Lock lock = new ReentrantLock();
  private final DataSource ds;
  private final long timeout;
  private Connection conn = null;
  private static final Logger log = Logger.getLogger("org.kered.dko.datasource.SingleThreadedDataSource");

  /**
   * @param ds
   * @param timeout (in millis)
   */
  public SingleThreadedDataSource(final DataSource ds, final long timeout, boolean reuse) {
    this.ds = ds;
    this.timeout = timeout;
  }

  @Override
  public synchronized Connection getConnection() throws SQLException {
    long stopBy = System.currentTimeMillis() + timeout;
    try {
      while (System.currentTimeMillis() < stopBy) {
        if (lock.tryLock(100, TimeUnit.MILLISECONDS)) {
          if (!connOk(conn)) conn = ds.getConnection();
          return new UnClosableConnection(conn, new UnClosableConnection.CloseListener() {
            @Override
            public void wasClosed(final UnClosableConnection c) {
              lock.unlock();
            }
          });
        }
      }
      throw new RuntimeException("unable to aquire connection lock after "+ timeout +"ms");
    } catch (final InterruptedException e) {
      throw new RuntimeException(e);
    }
  }

  private static boolean connOk(Connection conn) {
    if (conn==null) return false;
    try {
      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("select 1");
      rs.next();
      rs.getInt(1);
      stmt.close();
      return true;
    } catch (SQLException e) {
      e.printStackTrace();
      try {
        conn.close();
      } catch (SQLException e1) {
        e.printStackTrace();
      }
      conn = null;
      return false;
    }
  }

  @Override
  public Connection getConnection(final String username, final String password)
      throws SQLException {
    long stopBy = System.currentTimeMillis() + timeout;
    try {
      while (System.currentTimeMillis() < stopBy) {
        if (lock.tryLock(500, TimeUnit.MILLISECONDS)) {
          if (!connOk(conn)) conn = ds.getConnection(username, password);
          return new UnClosableConnection(conn, new UnClosableConnection.CloseListener() {
            @Override
            public void wasClosed(final UnClosableConnection c) {
              lock.unlock();
            }
          });
        }
      }
      throw new RuntimeException("unable to aquire connection lock after "+ timeout +"ms");
    } catch (final InterruptedException e) {
      throw new RuntimeException(e);
    }
  }

  @Override
  public PrintWriter getLogWriter() throws SQLException {
    return ds.getLogWriter();
  }

  @Override
  public void setLogWriter(final PrintWriter out) throws SQLException {
    ds.setLogWriter(out);
  }

  @Override
  public void setLoginTimeout(final int seconds) throws SQLException {
    ds.setLoginTimeout(seconds);
  }

  @Override
  public int getLoginTimeout() throws SQLException {
    return ds.getLoginTimeout();
  }

  @Override
  public <T> T unwrap(final Class<T> iface) throws SQLException {
    return ds.unwrap(iface);
  }

  @Override
  public boolean isWrapperFor(final Class<?> iface) throws SQLException {
    return ds.isWrapperFor(iface);
  }

  @Override
  public DataSource getPrimaryUnderlying() {
    return ds;
  }

  @Override
  public Collection<DataSource> getAllUnderlying() {
    final Collection<DataSource> ret = new ArrayList<DataSource>(1);
    ret.add(ds);
    return ret;
  }

  //@Override
  public Logger getParentLogger() throws SQLFeatureNotSupportedException {
    throw new SQLFeatureNotSupportedException();
  }

}




Java Source Code List

.HelloWorld.java
org.kered.contactlensfinder.DB.java
org.kered.contactlensfinder.MainActivity.java
org.kered.contactlensfinder.ViewManufacturersActivity.java
org.kered.contactlensfinder.ViewProductsActivity.java
org.kered.contactlensfinder.ViewPropertiesActivity.java
org.kered.dko.AbstractQuery.java
org.kered.dko.Bulk.java
org.kered.dko.CSV.java
org.kered.dko.ClosableIterator.java
org.kered.dko.Condition.java
org.kered.dko.Constants.java
org.kered.dko.Context.java
org.kered.dko.DBQuery.java
org.kered.dko.DBRowIterator.java
org.kered.dko.Diff.java
org.kered.dko.DualIterator.java
org.kered.dko.Expression.java
org.kered.dko.Field.java
org.kered.dko.FilteringQuery.java
org.kered.dko.Function.java
org.kered.dko.InMemoryQuery.java
org.kered.dko.Join.java
org.kered.dko.LazyCacheIterable.java
org.kered.dko.LocalJoin.java
org.kered.dko.M.java
org.kered.dko.Main.java
org.kered.dko.MatryoshkaQuery.java
org.kered.dko.PeekableClosableIterator.java
org.kered.dko.PeekableIterator.java
org.kered.dko.QueryAddField.java
org.kered.dko.QueryFactory.java
org.kered.dko.QuerySnapshot.java
org.kered.dko.Query.java
org.kered.dko.SQLFunction.java
org.kered.dko.SelectAsMapIterable.java
org.kered.dko.SelectFromOAI.java
org.kered.dko.SelectSingleColumn.java
org.kered.dko.SoftJoinUtil.java
org.kered.dko.SoftJoin.java
org.kered.dko.SqlContext.java
org.kered.dko.Statistics.java
org.kered.dko.SubQueryField.java
org.kered.dko.TableInfo.java
org.kered.dko.TableWrapper.java
org.kered.dko.Table.java
org.kered.dko.TemporaryTableFactory.java
org.kered.dko.TmpTableBuilder.java
org.kered.dko.Tuple.java
org.kered.dko.UsageMonitor.java
org.kered.dko.UsageStats.java
org.kered.dko.Util.java
org.kered.dko.ant.ClassGenerator.java
org.kered.dko.ant.CodeGeneratorBase.java
org.kered.dko.ant.CodeGenerator.java
org.kered.dko.ant.DataSourceGenerator.java
org.kered.dko.ant.GsonGenerator.java
org.kered.dko.ant.JoinGenerator.java
org.kered.dko.ant.Main.java
org.kered.dko.ant.SchemaExtractorBase.java
org.kered.dko.ant.SchemaExtractor.java
org.kered.dko.ant.Util.java
org.kered.dko.datasource.CheapConnectionPoolingDataSource.java
org.kered.dko.datasource.ConnectionCountingDataSource.java
org.kered.dko.datasource.JDBCDriverDataSource.java
org.kered.dko.datasource.MatryoshkaDataSource.java
org.kered.dko.datasource.MirroredDataSource.java
org.kered.dko.datasource.ReflectedDataSource.java
org.kered.dko.datasource.SingleConnectionDataSource.java
org.kered.dko.datasource.SingleThreadedDataSource.java
org.kered.dko.datasource.UnClosableConnection.java
org.kered.dko.datasource.Util.java
org.kered.dko.json.CDL.java
org.kered.dko.json.CookieList.java
org.kered.dko.json.Cookie.java
org.kered.dko.json.HTTPTokener.java
org.kered.dko.json.HTTP.java
org.kered.dko.json.JSONArray.java
org.kered.dko.json.JSONException.java
org.kered.dko.json.JSONML.java
org.kered.dko.json.JSONObject.java
org.kered.dko.json.JSONString.java
org.kered.dko.json.JSONStringer.java
org.kered.dko.json.JSONTokener.java
org.kered.dko.json.JSONWriter.java
org.kered.dko.json.Pickle.java
org.kered.dko.json.XMLTokener.java
org.kered.dko.json.XML.java
org.kered.dko.junk.DerbyLoadTestSchema.java
org.kered.dko.junk.OracleCreateTestUser.java
org.kered.dko.junk.OracleLoadTestSchema.java
org.kered.dko.persistence.Util.java
org.kered.dko.util.DumpDatabase.java
sakila.Example0.java
sakila.Example1.java
sakila.Example2.java
sakila.Util.java