Java >> Java tutorial >  >> Tag >> Jdbc

Samtidig brug af samme JDBC-forbindelse af flere tråde

Jeg kørte følgende sæt test ved hjælp af en AWS RDS Postgres-database og Java 11:

  1. Opret en tabel med 11 millioner rækker, hver række indeholder en enkelt TEKST-kolonne, udfyldt med en tilfældig 100-tegns streng

  2. Vælg en tilfældig streng på 5 tegn, og søg efter delvise overensstemmelser med denne streng i ovenstående tabel

  3. Tid, hvor lang tid det tager ovenstående forespørgsel at returnere resultater. I mit tilfælde tager det ~23 sekunder. Fordi der er meget få resultater, kan vi konkludere, at størstedelen af ​​disse 23 sekunder går med at vente på, at DB'en kører hele tabelscanningen, og ikke på at sende anmodnings-/svarpakkerne

  4. Kør flere forespørgsler parallelt (med forskellige søgeord) ved hjælp af forskellige forbindelser. I mit tilfælde ser jeg, at de alle er færdige på ~23 sekunder. Dvs., forespørgslerne bliver effektivt paralleliseret

  5. Kør flere forespørgsler på parallelle tråde ved at bruge den samme forbindelse. Jeg kan nu se, at det første resultat kommer tilbage om ~23 sekunder. Det andet resultat kommer tilbage om ~46 sekunder. Den tredje på ~1 minut. osv. osv. Alle resultater er funktionelt korrekte, idet de matcher det specifikke søgeord, der forespørges i den tråd

For at tilføje til det, Joni nævnte tidligere, matcher hans konklusion den adfærd, jeg også ser på Postgres. Det ser ud til, at al "korrekthed" er bevaret, men alle parallelitetsfordele går tabt, hvis der sendes flere forespørgsler på samme forbindelse på samme tid.


Da JDBC-specifikationen ikke giver garantier for samtidig udførelse, kan dette spørgsmål kun besvares ved at teste de drivere, du er interesseret i, eller læse deres kildekode.

I tilfælde af MySQL Connector/J, alle metoder til execute sætninger låser forbindelsen med en synchronized blok. Det vil sige, at hvis en tråd kører en forespørgsel, vil andre tråde, der bruger forbindelsen, blive blokeret, indtil den afsluttes.


Java tag