Wat is die "beste" manier om versprei transaksies oor verskeie databasisse met behulp van die lente en Hibernate doen

StackOverflow https://stackoverflow.com/questions/128377

Vra

Ek het 'n aansoek - meer soos 'n nut - wat sit in 'n hoek en updates twee verskillende databasisse van tyd tot tyd.

Dit is 'n bietjie selfstandige app wat is gebou met 'n Lente Aansoek konteks. Die konteks het twee Hibernate Sessie Fabrieke in dit ingestel het op sy beurt met behulp Commons DBCP data bronne in die lente ingestel.

Op die oomblik is daar geen transaksie bestuur, maar ek wil graag 'n paar by te voeg. Die update om 'n databasis hang af van 'n suksesvolle update na die ander.

Die inligting nie sit in 'n Java EE houer - dit is bootstrapped deur 'n statiese lanseerder klas genoem van 'n dop script. Die lanseerder klas instantiates die Aansoek Konteks en dan roep 'n metode op een van sy boontjies.

Wat is die "beste" manier om transactionality rondom die databasis updates sit?

Ek sal die definisie van "beste" om jou te laat, maar ek dink dit moet 'n paar funksie van 'maklik op te rig "," maklik om te instel "," goedkoop "en" maklik om te verpak en te herverdeel' wees. Natuurlik FOSS sal goed wees.

Was dit nuttig?

Oplossing

Die beste manier om transaksies oor meer as een databasis versprei is: Moenie

.

Sommige mense sal jou wys XA maar XA (of twee-fase pleeg) is 'n leuen (of marketese).

Verbeel jou: Na die eerste fase van die XA bestuurder het te kenne gegee dat dit kan stuur die finale pleeg, die netwerkverbinding na een van die databasisse versuim. Wat nou? Tyduit? Dit sou verlaat die ander databasis korrup. Terugrol? Twee probleme: Jy kan nie rol terug 'n pleeg en hoe weet jy wat gebeur het met die tweede databasis? Dalk is dit die netwerkverbinding misluk nadat dit suksesvol verbind die data en net die "sukses" boodskap is verlore?

Die beste manier is om die data in 'n enkele plek kopieer. Gebruik 'n skema wat jou toelaat om die afskrif aborteer en voortgaan dit te eniger tyd (byvoorbeeld, ignoreer data wat jy reeds het of bestel die kies van ID en vra net rekords> MAX (ID) van jou kopie). Beskerm dit met 'n transaksie. Dit is nie 'n probleem aangesien jy net lees data uit die bron, so wanneer die transaksie nie vir een of ander rede, kan jy die bron databasis ignoreer. Daarom is dit 'n gewone ou enkele bron transaksie.

As jy die data, verwerk gekopieer het plaaslik.

Ander wenke

Setup 'n transaksie bestuurder in jou konteks. Lente docs het voorbeelde, en dit is baie maklik. Dan wanneer jy 'n transaksie uit te voer:

try { 
    TransactionTemplate tt = new TransactionTemplate(txManager);

    tt.execute(new TransactionCallbackWithoutResult(){
    protected void doInTransactionWithoutResult(
            TransactionStatus status) {
        updateDb1();
        updateDb2();
    }
} catch (TransactionException ex) {
    // handle 
}

Vir meer voorbeelde, en inligting miskien kyk na hierdie: XA transaksies met behulp van die lente

As jy sê "twee verskillende databasisse", bedoel jy verskillende databasis servers, of twee verskillende skemas binne dieselfde DB bediener?

As die voormalige, dan as jy vol transactionality wil, dan moet jy die XA transaksie API, wat volle twee-fase pleeg bied. Maar nog belangriker, ook moet jy 'n transaksie koördineerder / monitor wat transaksie voortplanting bestuur tussen die verskillende databasis stelsels. Dit is deel van JavaEE spec, en 'n mooi ijl deel daarvan op daardie. Die TX-koördineerder self is 'n komplekse stuk sagteware. Jou aansoek sagteware (via die lente, as jy dit wil hê) praat met die koördineerder.

As jy egter net bedoel twee databasisse binne dieselfde DB bediener, dan vanielje JDBC transaksies moet net mooi werk, net jou operasies uit te voer teen beide databasisse binne 'n enkele transaksie.

In hierdie geval sou jy 'n transaksie Monitor (bediener ondersteun XA protokol) nodig het en maak seker dat jou databasisse ondersteun XA ook. . Die meeste (? Al) J2EE bedieners kom met Transaksie Monitor gebou in As jou kode nie aktief in J2EE server dan is daar n klomp van die selfstandige alternatiewe -. Atomicos, Bitronix, ens

Jy kan probeer Lente ChainedTransactionManager - http://docs.spring.io/spring-data/commons/docs/1.6.2.RELEASE/api/org/springframework/data/transaction/ChainedTransactionManager.html wat ondersteun versprei db transaksie. Dit kan 'n beter alternatief vir XA wees

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top