中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么從ConnectionPool的實現看design pattern的運用

發布時間:2021-12-18 17:18:31 來源:億速云 閱讀:110 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關怎么從ConnectionPool的實現看design pattern的運用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

從一個ConnectionPool的實現看design pattern的運用 (source code for Java 1.1) 

ConnectionPool.Java:

public interface ConnectionPool{
  Connection getConnection()
  throws test.res.ResourceNotAvailableException, sqlException;
  Connection getConnection(long timeout)
  throws test.res.ResourceTimeOutException, SQLException;
  void clear();
}

ConnectionHome.java:

public interface ConnectionHome{
 void releaseConnection(Connection conn);
}

ConnectionPooling.java:

public interface ConnectionPooling extends ConnectionHome{
  Connection getConnection()
  throws test.res.ResourceNotAvailableException, SQLException;
 
  Connection getConnection(long timeout)
  throws test.res.ResourceTimeOutException, SQLException;
  void clear();
  void releaseConnection(Connection conn);
}

ConnectionFactory.java:

public interface ConnectionFactory{
 public Connection createConnection()throws SQLException;
}

PooledConnection.java: (for Connection in Java 1.1.8)


public final class PooledConnection implements Connection{
  private interface ConnectionState{
  ConnectionState close();
  boolean isClosed();
  Connection getOpenConnection()
  throws SQLException;
  }
  private static class ClosedConnection implements ConnectionState{
  public final ConnectionState close(){return this;}
  public final Connection getOpenConnection()
  throws SQLException{
  throw new SQLException("Connection closed");
  }
  public final boolean isClosed(){return true;}
  private ClosedConnection(){}
  private static final ConnectionState _instance = new ClosedConnection();
  static ConnectionState instance(Connection conn, ConnectionHome home){return _instance;}
  }
 
  private static class OpenConnection implements ConnectionState{
   private final ConnectionHome home;
  private final Connection conn;
  public final ConnectionState close(){
  home.releaseConnection(conn);
  return ClosedConnection.instance(conn, home);
  }
  public final Connection getOpenConnection()
  {return conn;}
  public final boolean isClosed(){return false;}
  OpenConnection(Connection conn, ConnectionHome home){
   this.conn = conn; this.home = home;
  }
  static ConnectionState instance(Connection conn, ConnectionHome home){
   return new OpenConnection(conn, home);
  }
  }
  private ConnectionState state;
  public static Connection decorate(Connection conn, ConnectionHome home)
  throws SQLException{
   return new PooledConnection(conn, home);
  }
 
  private PooledConnection(Connection conn, ConnectionHome home)
  throws SQLException{
  if(conn.isClosed()){
  state = ClosedConnection.instance(conn, home);
  }
  else{
  state = OpenConnection.instance(conn, home);
  }
  } 
  public final boolean isClosed(){
  return state.isClosed();
  }

  public final void close(){
  state = state.close();
  }
  protected void finalize(){
   close();
  }
  private final Connection getOpenConnection()
  throws SQLException
  {return state.getOpenConnection();}
  /*****then, delegate all the other methods****/
  public final Statement createStatement()
  throws SQLException{
  return getOpenConnection().createStatement();
  }
 
  //....
  public final void clearWarnings()throws SQLException{
  getOpenConnection().clearWarnings();
  }
 
 
  public final void commit()throws SQLException{
  getOpenConnection().commit();
  }

  /*
  public final Statement createStatement(int resultSetType,
  int resultSetConcurrency)
  throws SQLException{
  return getOpenConnection().createStatement(resultSetType, resultSetConcurrency);
  }*/
 
  /*
  public final Statement createStatement(int resultSetType,
  int resultSetConcurrency, int resultSetHoldability)
  throws SQLException{
  return getOpenConnection().createStatement(resultSetType,
  resultSetConcurrency, resultSetHoldability);
  }*/
 
 
  public final boolean getAutoCommit()throws SQLException{
  return getOpenConnection().getAutoCommit();
  }
  public final String getCatalog()throws SQLException{
  return getOpenConnection().getCatalog();
  }
  /*
  public final int getHoldability()throws SQLException{
  return getOpenConnection().getHoldability();
  }*/
 
  public final DatabaseMetaData getMetaData()throws SQLException{
  return getOpenConnection().getMetaData();
  }
  public final int getTransactionIsolation()throws SQLException{
  return getOpenConnection().getTransactionIsolation();
  }
  /*
  public final Map getTypeMap()throws SQLException{
  return getOpenConnection().getTypeMap();
  }*/
  public final SQLWarning getWarnings()throws SQLException{
  return getOpenConnection().getWarnings();
  }

  public final boolean isReadOnly()throws SQLException{
  return getOpenConnection().isReadOnly();
  }
  public final String nativeSQL(String sql)throws SQLException{
  return getOpenConnection().nativeSQL(sql);
  }
  public final CallableStatement prepareCall(String sql)throws SQLException{
  return getOpenConnection().prepareCall(sql);
  }
  /*
  public final CallableStatement prepareCall(String sql,
  int resultSetType, int resultSetConcurrency)
  throws SQLException{
  return getOpenConnection().prepareCall(sql, resultSetType, resultSetConcurrency);
  }
 
  public final CallableStatement prepareCall(String sql,
  int resultSetType, int resultSetConcurrency, int resultSetHoldability)
  throws SQLException{
  return getOpenConnection().prepareCall(sql, resultSetType,
  resultSetConcurrency, resultSetHoldability);
  }*/
 
  public final PreparedStatement prepareStatement(String sql)
  throws SQLException{
  return getOpenConnection().prepareStatement(sql);
  }
  /*
  public final PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
  throws SQLException{
  return getOpenConnection().prepareStatement(sql, autoGeneratedKeys);
  }

  public final PreparedStatement prepareStatement(String sql, int[] columnIndexes)
  throws SQLException{
  return getOpenConnection().prepareStatement(sql, columnIndexes);
  }
 
  public final PreparedStatement prepareStatement(String sql,
  int resultSetType, int resultSetConcurrency)
  throws SQLException{
  return getOpenConnection().prepareStatement(sql,
  resultSetType, resultSetConcurrency);
  }
 
  public final PreparedStatement prepareStatement(String sql,
  int resultSetType, int resultSetConcurrency, int resultSetHoldability)
  throws SQLException{
  return getOpenConnection().prepareStatement(sql,
  resultSetType, resultSetConcurrency, resultSetHoldability);
  }
 
  public final PreparedStatement prepareStatement(String sql,
  String[] columnNames)
  throws SQLException{
  return getOpenConnection().prepareStatement(sql, columnNames);
  }
 
  public final void releaseSavepoint(Savepoint savepoint)throws SQLException{
  getOpenConnection().releaseSavepoint(savepoint);
  }*/
  public final void rollback()throws SQLException{
  getOpenConnection().rollback();
  }
  /*
  public final void rollback(Savepoint savepoint)
  throws SQLException{
  getOpenConnection().rollback(savepoint);
  }*/
 
  public final void setAutoCommit(boolean autoCommit)
  throws SQLException{
  getOpenConnection().setAutoCommit(autoCommit);
  }
 
  public final void setCatalog(String catalog)
  throws SQLException{
  getOpenConnection().setCatalog(catalog);
  }
  /*
  public final void setHoldability(int holdability)
  throws SQLException{
  getOpenConnection().setHoldability(holdability);
  }*/ 
  public final void setReadOnly(boolean readOnly)
  throws SQLException{
  getOpenConnection().setReadOnly(readOnly);
  }
  /*
  public final Savepoint setSavepoint()throws SQLException{
  return getOpenConnection().setSavepoint();
  }
 
  public final Savepoint setSavepoint(String name)
  throws SQLException{
  return getOpenConnection().setSavepoint(name);
  }*/
 
  public final void setTransactionIsolation(int level)
  throws SQLException{
  getOpenConnection().setTransactionIsolation(level);
  }
  /*public final void setTypeMap(Map map)throws SQLException{
  getOpenConnection().setTypeMap(map);
  }*/

  /*************************************************************************************************/
 

}

ConnectionPooling2Pool.java:

public class ConnectionPooling2Pool implements ConnectionPool{
  public final Connection getConnection()
  throws test.res.ResourceNotAvailableException, SQLException{
   return PooledConnection.decorate(pooling.getConnection(), pooling);
  }
  public final Connection getConnection(long timeout)
  throws test.res.ResourceTimeOutException, SQLException{
   return PooledConnection.decorate(pooling.getConnection(timeout), pooling);
  }
  public final void clear(){
   pooling.clear();
  }
  private final ConnectionPooling pooling;
  private ConnectionPooling2Pool(ConnectionPooling pooling){
   this.pooling = pooling;
  }
  public static ConnectionPool decorate(ConnectionPooling pooling){
   return new ConnectionPooling2Pool(pooling);
  }
}

ConnectionPoolingImpl.java: (a simple implementation of ConnectionMan)

public class ConnectionPoolingImpl implements ConnectionPooling
{
  private int client=0;
  private final Vector freeConn = new Vector();
  private final int maxConn;
  private final ConnectionFactory factory;

  static public ConnectionPooling instance(ConnectionFactory factory, int max){
   return new ConnectionPoolingImpl(factory, max);
  }
 
  private ConnectionPoolingImpl(ConnectionFactory factory, int max){
   this.factory = factory;
   this.maxConn = max;
  }

  public final synchronized void releaseConnection(Connection conn)
  {
  freeConn.addElement(conn);
  client--;
  notify();
  }

  public final synchronized Connection getConnection()
  throws ResourceNotAvailableException, SQLException
  {
  Connection conn = null;
  if(freeConn.size() > 0)
  {
  conn = (Connection)freeConn.lastElement();
  freeConn.removeElementAt(freeConn.size()-1);
  }
  else if(client < maxConn)
  {
  conn = factory.createConnection();
  }
  if(conn != null)
  {
  client++;
  return conn;
  }
  else
  {
  throw new ResourceNotAvailableException();
  }
  }

  public final synchronized Connection getConnection(long timeout)
  throws ResourceTimeOutException, SQLException
  {
  for(long startTime = new java.util.Date().getTime();;)
  {
  try
  {
  return getConnection();
  }
  catch(ResourceNotAvailableException e1)
  {
  try
  {
  wait(timeout);
  }
  catch(InterruptedException e2)
  {}
  if((new java.util.Date().getTime() - startTime) >= timeout)
  {
  throw new ResourceTimeOutException();
  }
  }
  }
  }


  public final synchronized int getfreeconn(){
  return freeConn.size();
  }
  public final int getmaxConn(){
  return maxConn;
  }
  public final synchronized int getclient(){
  return client;
  }
  public final synchronized void setclient(){
  client=0;
  }

  public final synchronized void clear(){
 closeAll();
  freeConn.removeAllElements();
  }
  private final void closeAll(){
  for(int i=0; i<freeConn.size();i++)
  {
  final Connection conn = (Connection)freeConn.elementAt(i);
  try{
  conn.close();
  }
  catch(SQLException sqlException){}
  }
  }
  protected void finalize(){
   closeAll();
  } 
}

ConnectionFactoryImpl.java:

public class ConnectionFactoryImpl
{
  private ConnectionFactoryImpl(){}
  static public ConnectionFactory instance(final String driver, final String url,
   final String user, final String pwd)
  throws SQLException, ClassNotFoundException{
 final Class driverClass = Class.forName(driver);
 return new ConnectionFactory(){
 private final Class keeper = driverClass;
 public final Connection createConnection()
 throws SQLException{
 return DriverManager.getConnection(url,user,pwd);
 }
 };
  }
  static public ConnectionFactory instance(final String driver, final String url)
  throws SQLException, ClassNotFoundException{
 final Class driverClass = Class.forName(driver);
 return new ConnectionFactory(){
 private final Class keeper = driverClass;
 public final Connection createConnection()
 throws SQLException{
 return DriverManager.getConnection(url);
 }
 };
 } 
}

TestConnectionPool.java:

public class TestConnectionPool{
 public static void test(String driver, String url, String user, String pwd)
 throws java.sql.SQLException, test.res.ResourceNotAvailableException, test.res.ResourceTimeOutException, ClassNotFoundException{
 final ConnectionPool pool = ConnectionPooling2Pool.decorate(
 ConnectionPoolingImpl.instance(
 ConnectionFactoryImpl.instance(driver, url, user, pwd),
 1000)
 );
 }
}

ResourceNotAvailableException.java:

public class ResourceNotAvailableException extends RuntimeException{
 public ResourceNotAvailableException(String msg){super(msg);}
 public ResourceNotAvailableException(){}
}

ResourceTimeOutException.java:

public class ResourceTimeOutException extends Exception{
 public ResourceTimeOutException(String msg){super(msg);}
 public ResourceTimeOutException(){}
}

看完上述內容,你們對怎么從ConnectionPool的實現看design pattern的運用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安新县| 仪征市| 德化县| 小金县| 马关县| 金昌市| 运城市| 门头沟区| 文化| 揭东县| 天长市| 牙克石市| 赤水市| 犍为县| 洞口县| 昌江| 阿巴嘎旗| 汶川县| 曲阳县| 招远市| 甘肃省| 浮梁县| 分宜县| 金华市| 曲周县| 崇文区| 台中市| 疏勒县| 阿克苏市| 富平县| 日喀则市| 青河县| 汶上县| 铜山县| 台湾省| 兴业县| 右玉县| 贡觉县| 庐江县| 日土县| 屯留县|