sql >> Database >  >> RDS >> PostgreSQL

JDBC:Kan ik een verbinding delen in een multithreading-app en genieten van leuke transacties?

Ja, in het algemeen moet u voor elke thread een nieuwe verbinding maken. Je hebt geen controle over hoe het besturingssysteem de uitvoering van threads in een time-segment regelt (ondanks het definiëren van je eigen kritieke secties), dus je zou per ongeluk meerdere threads kunnen hebben die proberen gegevens door die ene pijp te sturen.

Merk op dat hetzelfde geldt voor alle netwerkcommunicatie. Als u bijvoorbeeld twee threads had die één socket probeerden te delen met een HTTP-verbinding.

  • Draad 1 doet een verzoek
  • Thread 2 doet een verzoek
  • Thread 1 leest bytes uit de socket en leest onbewust het antwoord van het verzoek van thread 2

Als u al uw transacties in kritieke secties hebt verpakt en daarom andere threads voor een volledige begin-/vastleggingscyclus hebt geblokkeerd, kunt u mogelijk een databaseverbinding tussen threads delen. Maar zelfs dan zou ik dat niet doen, tenzij je echt kennis hebt van het JDBC-protocol.

Als de meeste van je threads niet vaak databaseverbindingen nodig hebben (of helemaal niet nodig hebben), kun je misschien één thread aanwijzen om je databasewerk te doen, en andere threads hun verzoeken in de wachtrij plaatsen voor die ene thread. Dat zou de overhead van zoveel verbindingen verminderen. Maar je zult moeten uitzoeken hoe je verbindingen per thread in je omgeving kunt beheren (of een andere specifieke vraag daarover stellen op StackOverflow).

bijwerken: Om uw vraag in de opmerking te beantwoorden, ondersteunen de meeste databasemerken geen meerdere gelijktijdige transacties op een enkele verbinding (InterBase/Firebird is de enige uitzondering die ik ken).

Het zou fijn zijn om een ​​apart transactie-object te hebben en meerdere transacties per verbinding te kunnen starten en vastleggen. Maar leveranciers ondersteunen het gewoon niet.

Evenzo gaan standaard leveranciersonafhankelijke API's zoals JDBC en ODBC uit van dezelfde veronderstelling, dat de transactiestatus slechts een eigenschap is van het verbindingsobject.



  1. laravel 5 inner join en groeperen op query syntaxisfout

  2. Zoeken in volledige tekst gebruiken in SQL Server 2008 voor meerdere tabellen, kolommen

  3. SQL Express voor productie?

  4. Zoeken in een genest/multi-level Postgres JSON-type met behulp van Active Record