[hibernate-dev] SynchronizationRegistry: expose read (lookup) operations?
Jonathan Halliday
jonathan.halliday at redhat.com
Wed Oct 25 12:13:03 EDT 2017
so you have some form of implicit cleanup that de-registers
Synchronizations when the transaction finishes, or do they stay
registered and re-fire for each tx on the connection?
As to the multiple registration semantics, IIRC the arjuna code allows
the same Synchronization to be registered multiple times and in such
case it will be called multiple times too. No reason you need to follow
that model unless you're delegating to the tx engine though. If you go
for 'we always generate the key for you', then calling
String id = sr.register(sync)
twice could just give you back the same id. Downside is you need to
store that id someplace, which misses the point of allowing a fixed
constant as the key. I'm rather assuming that's the requirement here,
since if you're needing to keep and pass around a uniq key then you may
as well just pass around the sync object itself? Anyhow, is a key of any
form necessary for that use case? Could retrieval just be
sr.getSynchronizationsOfType(thing.class)
to match on class/interface, which should be all that's needed to find
e.g. the cache/search/whatever synchronization. Not having a key means
saves having to define how it behaves. Lookup maybe slower if you're
going to support polymorphism though, but the number of Synchronizations
per tx should be small.
Jonathan.
On 25/10/17 16:39, Steve Ebersole wrote:
> The SynchronizationRegistry is kept per-LogicalConncection which might
> span multiple physical transactions.
>
> On Wed, Oct 25, 2017 at 10:37 AM Jonathan Halliday
> <jonathan.halliday at redhat.com <mailto:jonathan.halliday at redhat.com>> wrote:
>
>
> right, a lot of JTA works on the 'tx bound to thread' approach and it's
> a right pain in async I/O thread pooled environments like vert.x That's
> one of the reasons why sticking a get/put api on the Transaction
> instance abstraction instead may make more sense, though I'm guessing
> your SynchronizationRegistry is instance per tx rather than a singleton
> like the JTA one is, so it may not make much difference which object
> carries the functionality for your case?
>
> Jonathan.
>
> On 25/10/17 16:25, Steve Ebersole wrote:
> > Also, unless I am mistaken `TransactionSynchronizationRegistry#put`
> > works on the principle that the "current transaction" is
> associated with
> > the current thread. I absolutely want to stay away from that as an
> > assumption here. It simply does not hold true in the JDBC txn case.
> >
> > On Wed, Oct 25, 2017 at 10:24 AM Steve Ebersole
> <steve at hibernate.org <mailto:steve at hibernate.org>
> > <mailto:steve at hibernate.org <mailto:steve at hibernate.org>>> wrote:
> >
> > Jonathan, we aren't going to be exposing this or using this
> > via TransactionSynchronizationRegistry. Your comment about a
> > "dummy" in the JDBC txn case is exactly why. We already have
> such
> > an abstraction : SynchronizationRegistry
> >
> > On Wed, Oct 25, 2017 at 10:22 AM Steve Ebersole
> <steve at hibernate.org <mailto:steve at hibernate.org>
> > <mailto:steve at hibernate.org <mailto:steve at hibernate.org>>> wrote:
> >
> > Yes that would work for me, but thinking about the
> > implementation it
> > implies you'd need to hold on to both a Set and a
> Map, and
> > then we'd
> > be exposed to silly usage like people adding the same
> > synchronization
> > twice in two different ways?
> >
> >
> > Does it? Nothing in the SPI requires us to store things
> in any
> > specific way. E.g. we can keep just a Map - when we are
> passed
> > a KeyableSynchronization we'd use that key, when we are
> passed a
> > non-KeyableSynchronization Synchronization we'd generate one
> > ourselves.
> >
> > And we cant stop people from every conceivable "silly usage".
> > At some point we are professional developers and should
> be able
> > to do the non-silly things ;)
> >
> > And as far as your "register the thing twice" worry...
> > rhetorically, what stops them from calling:
> >
> > reg.register( "abc", MySync.INSTANCE )
> > reg.register( "123", MySync.INSTANCE )
> >
> > Nothing.
> >
> >
> > I'd rather expose a single consistent way: having to
> make up
> > an id
> > doesn't seem too inconvenient considering it's an SPI.
> >
> >
> > Well, again, I don't see how KeyableSynchronization is a
> > "inconsistent" approach. In fact out of the 2, it is my
> preferance.
> >
>
> --
> Registered in England and Wales under Company Registration No. 03798903
> Directors: Michael Cunningham, Michael ("Mike") O'Neill, Eric Shander
>
--
Registered in England and Wales under Company Registration No. 03798903
Directors: Michael Cunningham, Michael ("Mike") O'Neill, Eric Shander
More information about the hibernate-dev
mailing list