[TransWarp] CIS and Threaded Apps

Ulrich Eck ueck at net-labs.de
Mon Jun 10 04:13:34 EDT 2002

> Just a reminder: as I said previously, the Database package will see
> *heavy* refactoring in the 0.3 release cycle, and is effectively
> "unsupported" during the 0.2 release cycle.  Something like your
> structuring may take effect in the 0.3 refactoring, or it may not.

ok .. I'll stay with my stuff right now and use it.

> Hm.  This strikes me as problematic to use with CIS bindings, unless the
> pool is a proxy of some kind, and then it needs to also know when to
> allocate/release an object.  My architectural assumption about threads and
> pooling is that you'll create separate instances of the App-level object
> and pool *those*, rather than individual components within the
> application.  This works well in Zope, and it localizes the lifecycle
> issue, while avoiding proxies and pretty much all possible thread
> synchronization.

I think this is to "Zope-Centric". In my opinion, Pooling Data-Access is a 
must but do you really think that Process-Objects (things that implement
mostly logic) should be pooled as whole ??? 

What about sharing data between threads ?? this is one of the most important 
matters for me using threads .. otherwise I could use seperate processes as 
well ..

I think that it will be a major performance problem, if every call from 
outside (e.g. get me this Attributes from that Object out of the LDAP/SQL)
leads to instancing a complete app-instance (even we are using SEF.Service
mostly), creating a new connection, authenticating it, initializing the 
Database and Caches. Using persitent connections and a certain 
pooling-algorithm that can handle the things you talked about above e.g.:

Within my TransactionAwarePool there are 3 Classes:

1. InstancePoolService: Transparently switches between the objects it holds
    for each incoming call and can be used to serve Instances without
    modifying code that works without pooling. it is a Mixture of Once and
    AutoCreateable and therefore it's not too much overhead (depends only on
    the algorithm that is needed to select/manage instances for calls. It 
    does not explicitly depend on threads to switch .. e.g. the implementation
    of it in Transactions uses the TransactionID to determine, if a thread 
    already has a Instance Assigned or not. If not, it try's to return a free
    Instance, if none is avaliable, the call is blocked until an Instance gets
    free again. With this approach I'm able to share Transactions and the 
    Instances between threads that belong together, which is what we wanted 
    to be able to.

2. PooledObjectWrapper: This class is a wrapper for a pooled instances maybe a
    service may be something else. it has two methods: use(client) and free()
    those methods are called, when an Instance is used or not needed anymore.
    It has a ObjectTransactionNotifier.

3. ObjectTransactionNotifier: Similar to your Database.Transactions.\
    TransactionNotifier and it helps the IPS/POW to find the Transaction-
    Boundaries and frees instances with forget(=tpc_finish). Similar Classes
    could recognize Users that use an Instance for the first time and register
    a callback when they logout or just define an idle timeout.

In all "Non-Database-Relevant" parts there are not too much things two worry 
about threads in our cases i think.

do you still think this approach won't work in most cases ??


Ulrich Eck
net-labs Systemhaus GmbH
ueck at net-labs.de

p.s. sorry for the inconvinience that you have with my postings recently, but 
we have a central mailbox (lists at net-labs.de) that is subscribed to all our 
mailinglists to minimize the amount of traffic on our connection. is it 
possible to allow ueck at net-labs.de to post but without receiving any messages 

More information about the PEAK mailing list