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 <[email protected]>: > 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. >> > >
