sql >> Databasteknik >  >> RDS >> PostgreSQL

JDBC:Kan jag dela en anslutning i en multithreading-app och njuta av trevliga transaktioner?

Ja, i allmänhet måste du skapa en ny anslutning för varje tråd. Du har inte kontroll över hur operativsystemet tidsdelar exekvering av trådar (trots att du definierar dina egna kritiska sektioner), så du kan oavsiktligt ha flera trådar som försöker skicka data i samma rör.

Observera att detsamma gäller för all nätverkskommunikation. Om du hade två trådar som försökte dela en socket med en HTTP-anslutning, till exempel.

  • Tråd 1 gör en begäran
  • Tråd 2 gör en begäran
  • Tråd 1 läser bytes från sockeln och läser omedvetet svaret från tråd 2:s begäran

Om du lindade alla dina transaktioner i kritiska sektioner, och därför låser ut alla andra trådar under en hel start/commit-cykel, kan du kanske dela en databasanslutning mellan trådar. Men jag skulle inte göra det ens då, om du inte verkligen har medfödd kunskap om JDBC-protokollet.

Om de flesta av dina trådar sällan har behov av databasanslutningar (eller inget behov alls), kanske du kan utse en tråd för att utföra ditt databasarbete och låta andra trådar köa sina förfrågningar till den tråden. Det skulle minska omkostnaderna för så många anslutningar. Men du måste ta reda på hur du hanterar anslutningar per tråd i din miljö (eller ställ en annan specifik fråga om det på StackOverflow).

uppdatering: För att svara på din fråga i kommentaren, stöder de flesta databasmärken inte flera samtidiga transaktioner på en enda anslutning (InterBase/Firebird är det enda undantaget jag känner till).

Det skulle vara trevligt att ha ett separat transaktionsobjekt och att kunna starta och utföra flera transaktioner per anslutning. Men leverantörer stöder det helt enkelt inte.

På samma sätt gör standardleverantörsoberoende API:er som JDBC och ODBC samma antagande, att transaktionstillståndet bara är en egenskap hos anslutningsobjektet.



  1. ORA-06550:Fel nummer eller typ av argumentfel vid anrop av en funktion i ett oracle-paket i ASP.NET

  2. hur man anropar lagrad funktion för IN- och UT-parameter i Oracle Database med Java

  3. SQL:Välj endast kolumner med NULL-värden

  4. Hur man separerar en post för att få beloppet