Java >> Java tutorial >  >> Tag >> SQL

Er java.sql.Connection Thread-Safe?

1. Oversigt

Når vi arbejder på multi-threading-projekter, ved vi, at hvis flere tråde deler objekter, der ikke er implementeret med trådsikkerhed i tankerne, kan trådene opføre sig uventet .

Mange af os har måske lidt af trådsikre problemer. Så spørgsmålet:"Er denne klasse trådsikker?" kommer ofte til at tænke på.

Det er ret almindeligt, at en Java-applikation får adgang til relationelle databaser via JDBC og også gør brug af multi-threading. I dette hurtige selvstudie skal vi diskutere, om java.sql.Connection er trådsikker.

2. java.sql.Connection Interface

Når vi tilgår databaser via JDBC fra vores applikationer, bruger vi direkte eller indirekte java.sql.Connection genstande. Vi er afhængige af disse forbindelsesobjekter til at udføre databaseoperationer. Derfor java.sql.Connection er en ret vigtig type i JDBC.

Det er også et almindeligt scenarie, at flere tråde skal tale til en database samtidigt. Som et resultat hører vi ofte spørgsmålet:"Er java.sql.Connection trådsikker?”

I de næste par afsnit vil vi se nærmere på dette spørgsmål. Yderligere vil vi diskutere en korrekt tilgang til brug af java.sql.Connection objekter blandt flere tråde, så flere tråde kan få adgang til databasen samtidigt.

3. Tråd Safty og java.sql.Connection

Lad os først og fremmest tale om trådsikkerhed hurtigt. Trådsikkerhed er en programmeringsmetode. Det vil sige, at det er et implementeringsrelateret koncept. Derfor kan vi bruge forskellige teknikker til at gøre en implementering trådsikker - for eksempel statsløse implementeringer, uforanderlige implementeringer og mere.

Lad os nu tage et kig på java.sql.Connection . Først og fremmest er det en grænseflade - den indeholder ikke nogen implementering. Derfor giver det ikke meget mening, hvis vi spørger generelt:"Er java.sql.Connection  trådsikker?” Vi er nødt til at tjekke de klasser, der implementerer denne grænseflade, for at afgøre, om en implementering er trådsikker eller ej.

Nå, et par spørgsmål dukker op med det samme:Hvilke klasser implementerer denne grænseflade? Er de trådsikre?

Normalt implementerer vi ikke java.sql.Connection interface i vores applikationskode. JDBC-drivere vil implementere denne grænseflade så vi kan få forbindelsen til en bestemt database, såsom SQL Server eller Oracle.

Derfor er trådsikkerheden for Forbindelsen implementering er fuldstændig afhængig af JDBC-driverne.

Dernæst vil vi undersøge et par database JDBC-drivere som eksempler.

4. java.sql.Connection Implementeringseksempler

Microsoft SQL Server og Oracle Database er to udbredte relationelle databaseprodukter.

I dette afsnit vil vi se på JDBC-driverne til disse to databaser og diskutere, om deres implementeringer af java.sql.Connection grænsefladen er trådsikker.

4.1. Microsoft SQLServer

Microsoft SQL Server-driverklassen, SQLServerConnection , implementerer java.sql.Connection grænsefladen og er ikke trådsikker ifølge dens Javadoc:

SQLServerConnection er ikke trådsikker, men flere sætninger oprettet fra en enkelt forbindelse kan behandles samtidigt i samtidige tråde.

Så det betyder, at vi ikke bør dele en SQLServerConnection objekt blandt tråde, men vi kan dele udsagn oprettet fra den samme SQLServerConnection objekt .

Lad os derefter tage et kig på et andet velkendt databaseprodukt, Oracle Database.

4.2. Oracle-database

Den officielle Oracle JDBC-driver implementerer java.sql.Connection grænseflade på en trådsikker måde.

Oracle angiver trådsikkerheden for sin forbindelse implementering i sit officielle dokument:

Oracle JDBC-driverne yder fuld support til og er meget optimeret til applikationer, der bruger Java multithreading …

Oracle fraråder dog kraftigt at dele en databaseforbindelse mellem flere tråde. Undgå at tillade flere tråde at få adgang til en forbindelse samtidigt …

Tja, baseret på beskrivelsen ovenfor kan vi sige, at Oracles forbindelsesimplementering er trådsikker. Men at dele et forbindelsesobjekt mellem flere tråde er "på det kraftigste frarådes" .

Så fra SQL Server- og Oracle-eksemplerne ved vi, at vi ikke kan antage, at en java.sql.Connection implementering er trådsikker. Så kan vi spørge, hvad er den rigtige tilgang, hvis vi ønsker, at flere tråde skal have adgang til en database samtidigt? Lad os finde ud af det i næste afsnit.

5. Brug af en forbindelsespool

Når vi tilgår en database fra vores applikation, skal vi først etablere forbindelsen til databasen. Dette betragtes som en dyr operation. For at forbedre ydeevnen bruger vi normalt en forbindelsespulje.

Lad os hurtigt forstå, hvordan en forbindelsespulje fungerer i et scenarie med flere tråde.

En forbindelsespulje rummer flere forbindelsesobjekter. Vi kan konfigurere størrelsen på en pool.

Når flere tråde skal have adgang til en database samtidigt, anmoder de om forbindelsesobjekter fra forbindelsespuljen.

Hvis der stadig er ledige forbindelser i puljen, vil en tråd få et forbindelsesobjekt og starte sine databaseoperationer. Når tråden er færdig med sit arbejde, returnerer den forbindelsen til poolen.

Hvis der ikke er nogen ledig forbindelse i poolen, vil tråden vente på, at et forbindelsesobjekt returneres til poolen af ​​en anden tråd.

Derfor giver en forbindelsespulje flere tråde adgang til databasen samtidigt ved at bruge forskellige forbindelsesobjekter i stedet for at dele den samme .

På denne måde behøver vi desuden ikke bekymre os om implementeringen af ​​Forbindelsen grænsefladen er trådsikker.

6. Konklusion

I denne artikel har vi diskuteret det ofte stillede spørgsmål:Er java.sql.Connection trådsikker?

Som java.sql.Connection er en grænseflade, er det ikke let at forudsige, om implementeringerne er trådsikre.

Desuden har vi adresseret, at en forbindelsespulje er en korrekt måde at håndtere forbindelser på, hvis flere tråde skal have adgang til databasen samtidigt.


Java tag