Re: Singletons in Cayenne and problems. Can I use multiple transactions?

From: Evgeny Ryabitskiy (evgeny.ryabitski..mail.com)
Date: Tue Dec 01 2009 - 08:27:55 EST

  • Next message: Evgeny Ryabitskiy: "Re: [jira] Created: (CAY-1322) Multiple Transactions: Migrate from Singleton pattern"

    Problem in multiple Domains.
    When I am creating transaction I am creating it's for specific
    DataDomain (like a DataContext).
    When I have 2 Modules with dedicated DataDomains (so it will be 2
    DataDomains) I can create 2 Transactions
    (domain.createTransaction()).

    But to thread I can bind only one. Then when I start performing queries I got:
    1)First Domain Transaction is binded and handled normally
    2)Second Domain Transaction is override by first DataDomain. So when I
    perform query for second: ThreadLocals return Transaction for firs
    Domain.

    Evgeny

    2009/12/1 Andrus Adamchik <andru..bjectstyle.org>:
    > Singletons are bad in a general purpose framework, like Cayenne. No question
    > about that. Per your description even thread-local singletons can be a
    > problem, which is less obvious to me, but I guess real in some
    > circumstances. So let's see what those are.
    >
    >> 2)DataContext.getThreadLocal()
    >> Solved by own ThreadLocal for each module. (modules can work in one
    >> thread)
    >> //also spend some time
    >
    > This is just a convenience in Cayenne. Nobody's forced to use it. I will go
    > as far as to suggest to remove it from Cayenne 3.1 as a built-in feature,
    > and just document it as a possible design pattern in a user application.
    >
    >> 3)Transaction.getThreadTransaction()
    >> this is killing one!!!
    >> using of own ThreadLocal doesn't help.
    >> It's hard-coded in performing Query to use this singleton
    >> Transaction.getThreadTransaction()
    >> And that is really huge problem for me.
    >
    > J2EE pattern of tying a transaction to an execution thread, even if multiple
    > data sources are involved, makes sense as it allows to commit/rollback
    > multiple things at once. Cayenne Transaction sort of follows that. JDBC
    > connections within the transaction are scoped by DataNode name. So what
    > exactly is the problem?
    >
    > Andrus
    >
    >
    >
    > On Dec 1, 2009, at 2:44 PM, Evgeny Ryabitskiy wrote:
    >
    >> Hello 2 everyone!
    >>
    >> Today I one more time thinking about singleton pattern and it's hard
    >> usssage in Cayenne.
    >>
    >> So.. I have several modules, each has own DomainConfig file and
    >> connection to it's DataBase. Sometimes there can be used different DB
    >> servers and even different DB types (usually it's Oracle and MS SQL,
    >> sometimes Sybase).
    >>
    >> Singletons:
    >> 1) Configuration.getSharedConfiguration()
    >> This problem is solved:
    >> DefaultConfiguration conf = new
    >> DefaultConfiguration("module1-cayenne.xml");
    >> conf .initialize;
    >> conf.getDomain();
    >> //spend some time to find solution... everywhere examples with
    >> SharedConfiguration
    >>
    >> 2)DataContext.getThreadLocal()
    >> Solved by own ThreadLocal for each module. (modules can work in one
    >> thread)
    >> //also spend some time
    >>
    >> 3)Transaction.getThreadTransaction()
    >> this is killing one!!!
    >> using of own ThreadLocal doesn't help.
    >> It's hard-coded in performing Query to use this singleton
    >> Transaction.getThreadTransaction()
    >> And that is really huge problem for me.
    >>
    >> So me suggestion is to move this ThreadLocal to DataDomain. Still can
    >> use singleton API for standalone applications.
    >> Also we can move DataContext to DataDomain.
    >>
    >> Evgeny.
    >>
    >
    >



    This archive was generated by hypermail 2.0.0 : Tue Dec 01 2009 - 08:28:22 EST