Craig,

That sounds pretty exciting. Now, how could I, if at all, incorporate
this Filter/Chian functionality in my existing Struts 1.1 app?

ATTA


On Sat, 18 Sep 2004 07:19:45 -0700, Craig McClanahan <[EMAIL PROTECTED]> wrote:
> Commons Chain (on which Struts Chain is based) has a design pattern
> built in for the general case were one command in the chain wants to
> allocate resources that will be required for later commands in the
> chain, plus the ability to clean up that resource when the chain
> completes.  See the Javadocs for org.apache.commons.chain.Filter.
> 
> For example, assume you want to allocate a connection from a
> connection pool defined as a JNDI resource (the same principle applies
> to any other sort of resource allocation factory) -- create a Filter
> with the following functionality:
> 
> * In the execute() method, acquire a reference to the data source,
>   acquire a connection, and store it as an attribute in the context.
> 
>   public boolean execute(Context context) throws Exception {
>       InitialContext ic = new InitialContext();
>       DataSource ds = (DataSource)
>         ic.lookup("java:comp/env/jdbc/CustomerDatabase");
>       Connection conn = ds.getConnection();
>       context.put("connection", conn);
>       return false;
>   }
> 
> * In the postprocess() method, call close() on the connection,
>   which returns it to the pool:
> 
>   public boolean postprocess(Context context, Exception exception) {
>     Connection conn = (Connection) context.get("connection");
>     conn.close();
>     return false;
>   }
> 
>   Note that the postprocessing method will be called even if an
> exception was thrown in a
>   subsequently called command.
> 
> In all other commands, the execute() method can simply use the
> allocated resource, without having to care how it got there:
> 
>   public boolean execute(Context context) throws Exception {
>     Connection conn = (Connection) context.get("connection");
>     ... use the connection to perform database transactions ...
>   }
> 
> Using this design, you don't have to worry about external storage of
> the allocated resources -- just store them under a well known
> attribute name in the context object that is passed in to all
> commands.
> 
> Craig
> 
> On Fri, 17 Sep 2004 14:43:57 -0400, Sean Schofield
> 
> 
> <[EMAIL PROTECTED]> wrote:
> > I have a problem and a proposed solution.  I would greatly appreciate any feedback 
> > about the proposed solution.
> >
> > Problem:
> > =======
> > I'm currently using a Struts application with a connection pool (using DBCP as 
> > supplied by Tomat).  When a database update is needed, the Struts actions will 
> > call the facade which will talk to my service layer (currently POJO's which handle 
> > business logic.)  My service layer in turn talks to the appropriate DAO.  Each of 
> > these DAO's extends from a common abstract class that provides basic functionality 
> > including obtaining a connection from the DataSource (via the pool).  A key aspect 
> > of my design is that some updates are in distinct areas of the database and so I 
> > have different DAO's for each area (ex. one for "workflow" on for "document.")
> >
> > As currently implemented I am unable to take advantage of transactions because the 
> > two DAOs will be getting a connection indepently from the pool and they will most 
> > likely not obtain the connection each time.  If I could just get the same 
> > connection each time, then I could use setAutoCommit(false).
> >
> > Proposed Solution:
> > ==============
> > I'm thinking I could set up a few chains for the various kind of updates.  The 
> > chains would be called by the POJO service layer (instead of calling the DAO's 
> > directly.)  The first Command in the chain would be to indentify all database 
> > updates in the chain as needing transactions.  This would be done through a static 
> > method on a new object called TransactionManager.  Basically I would have a 
> > hashtable that would maintain connections for the duration of the chain.  The 
> > connections would be stored by the current thread (use that as the key to the 
> > table.)
> >
> > Then when a command down the line needs a database connection, it would first 
> > check to see if there is one already set aside for it to use.  Actually the 
> > command would call the DAO and the DAO would check.  The command would also be 
> > decorated by a custom wrapper so that if the DAO's try to close the connection, 
> > I'll ignore it.  Then when the chain does the post processing in reverse order.  
> > So the last clean up step will be to check for my custom DAOException.  If there 
> > is one, then rollback, otherwise commit.  Finally, the connection is removed from 
> > the TransactionManager.
> >
> > I think this might be crazy enough to work.  I know we could allways use EJB and 
> > get transactions but that might be overkill since the volume is very light (this 
> > is custom software for a government agency not ecommerce.)  Please let me know 
> > what you think.  A big question I have is about storing and retrieving the datbase 
> > connection using the current thread as the key to a hashtable.  Also, I know that 
> > I will have to be careful with thread synchronization.
> >
> > Thanks,
> > sean
> >
> >
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to