Johan,

This codebase is being developed as part of the new Commons subproject
(proposal pending). 

The best place to discuss this would be the library-dev list <
[EMAIL PROTECTED] >.

Johan Compagner wrote:
> 
> Hi,
> 
> I looked at that pooling framework and have some comments, i hope that
> i can mail them to this list.
> 
> 1>
> Why isn't there a closed boolean in the PoolablePreparedStatement/Connection?
> If users do call the closed() method but then make a mistake and do use
> the connection or the statement again, then the still can do that! (no error will 
>apear
> except when another also did get that statement again. very strange error phrone
> situations can happen!!)
> So i do think that there should be a closed boolean and when that one is true
> no method call can be done anymore without throwing an exception.
> Because there should be a boolean check the 2 delegating classes can be
> discarded in this example because you in the Poolable versions you still need to
> have all the methods because there should be a boolean check.
> 
> 2>
> Why is the Factory implementation: KeyedPoolableObjectFactory or 
>PoolableObjectFactory
> be implemented in the Normal/Outer class (PoolingConnection and BaseConnectionPool)
> If find this very confusing and bad design.
> Because for example PoolingConnection.makeObject(Object) what does this do?
> If you look at this then you should think that it makes a PoolingConnection Object 
>for the
> specifiek object that is given (like Locale.getCurrencyInstance(Locale) ect ect)
> This Factory implementation should really be in an other class:
> PreparedStatementFactory or ConnectionFactory and if this class is absolutly only be 
>used
> by PoolingConnection or BaseConnectionPool they should be private innerclasses i 
>think.
> 
> 3>
> the passivate methods of connection:
> Why is only the autocommit and the readonly set back the the default values?
> Why aren't clearWarnings(), setCatalog , setTransactionIsolation and setTypeMap 
>called?
> To get a exact copy of the original connection back?
> But when calling those set methods there must be a check if it is really changed!!
>   if(!conn.getCatalog().equals(this.catalog))
>   {
>    conn.setCatalog(this.catalog);
>   }
> Because if you don't do the above then the JDBC-ODBC bridge (to a acces mdb) doesn't 
>work anymore
> when you want to pool the prepared statements of this connection. So maybe more have 
>this limitation.
> 
> The same for PreparedStatement.passivate:
> Why are only the clearParameters() called?
> There could be a batch() or warnings, or a left over resultset.
> My close of my pooledpreparedstatement is this:
> 
>  try  {
>   java.sql.ResultSet rs = _ps.getResultSet();
>   if(rs != null)  {
>    rs.close();
>   }
>  }
>  catch (SQLException e) { }
>  try  {
>   clearBatch();
>  }
>  catch (SQLException sqlE) { }
>  catch (UnsupportedOperationException uoe){}
>  try  {
>   clearParameters();
>  }
>  catch (Exception e) { }
>  try  {
>   clearWarnings();
>  }
>  catch (SQLException e) { }
>  _bClosed = true;
> 
> 4>
> I am planning (or already beginning to implement) also a bit of transcaction control.
> Very simple in the beginning:
> 
> User calls:
>     Datasouce.startTranscation() (a transcation is started for the current thread)
>     Datasource.getConnection() (a connection is created/borrowed and attached the 
>the current transaction)
>     Datasouce.startTranscation() (Ignored because there was already a transaction 
>for the current thread, using that one)
>     Datasource.getConnection() (the connection of the current transaction is 
>returned!!!)
>     Connection.close() (Connection is not "closed" (or returnend) yet because there 
>is another one in this transaction holding on to
> it)
>     Connection.rollback() (At this point something is gone wrong. The 
>onlyRollBackBoolean == true)
>     Datasource.getConnection() (the connection of the current transaction is 
>returned!!!)
>     Connection.close() (Connection is not "closed" (or returnend) yet because there 
>is another one in this transaction holding on to
> it)
>     Connection.commit() (Exception because it could only be rollbacked)
>     Connection.getError() get's the error why it is gone wrong
>     Connection.close() (Connection is "closed" or returnend because there is no one 
>in this transaction holding on to it)
> 
>     Connection.getStatus() (Can alway's be called, returns OnlyRollBack or something 
>like that)
> 
> If there is call to getConnection but there is not a current Transaction, a 
>Transaction will be made.
> 
> I want this because i make my Database Objects just as Entity beans (for easy 
>transaction to a EJB server at one time)
> so:
>     class Customer
>     {
>         public static Customer findCustomerByPrimaryKey(int key or PrimaryKey key)
>         {
>                 Connection connection =  datasource.getConnection(); // Auto made a 
>Transaction
>                 // Select the customer and makes a customer (maybe the Customer is 
>Pooled in a CacheablePool see below)
>                 // Customer has a reference (foreign key) to another Object: Country:
>                 customer.setCountry(Country.findCountryByPrimaryKey(rs.getInt(x)));
>         }
>     }
> 
>     class Country
>     {
>         public static Country findCountryByPrimaryKey(int key)
>         {
>                 // datasouce returns the same Connection, because it is in same 
>transaction/thread
>                 // This is absolutly necessary because i would run out of 
>connections when i don't get the same connection back
>                 // If for example only 2 connections can be made (the max value) and 
>the Country also did a call to
>                 // another object which also called datasource.getConnection() there 
>would be a deadlock!!!!
>                 // In the current implementation of struts/my program i give the 
>current connection with the method call
>                 Connection connection =  datasource.getConnection();
>                 // Select the country
>                 Return country.
>         }
>     }
> 
> Anybody interrested or has more idee's about this?
> 
> 5>
> About the pooling framework:
> In the GenericXXXPool classes objects are being destroyed if they are
> are idle long enough. This is in a loop that is completly synchronized so when it
> runs and walks through the complete list the pool is completely locked
> I really would like to have an implementation that uses weak references.
> So a cache object pool. Let the JVM decide when there is not enough memory anymore.
> This wouldn't work for everything because you lose the abillty to call destroy (or 
>you must
> do this in the finalize of the wrapper around the real object)
> 
> Johan Compagner

-- Ted Husted, Husted dot Com, Fairport NY USA.
-- Custom Software ~ Technical Services.
-- Tel 716 737-3463.
-- http://www.husted.com/about/struts/

Reply via email to