sql >> Database teknologi >  >> RDS >> PostgreSQL

Fremstil et 'DataSource'-objekt til Postgres JDBC, programmatisk

tl;dr

PGSimpleDataSource klasse bundtet med JDBC-driveren fra jdbc.postgresql.org implementerer DataSource interface. Konfigurer dine databaseforbindelsesdetaljer i en PGSimpleDataSource objekt, og gå rundt som en DataSource objekt.

PGSimpleDataSource ds = new PGSimpleDataSource() ;  
ds.setServerName( "localhost" );  
ds.setDatabaseName( "your_db_name_here" );   
ds.setUser( "scott" );       
ds.setPassword( "tiger" );   

Brug dette objekt til at oprette forbindelse til databasen efter behov. Brug praktisk prøve-med-ressourcer-syntaks.

try
(
    Connection conn = ds.getConnection() ;
) 
{ … }

JDBC-driverimplementering

Din JDBC-driver kan give dig en implementering af DataSource grænseflade.

Et objekt i denne implementering indeholder den information, der er nødvendig for at oprette og konfigurere en forbindelse til databasen, såsom:

  • Navn og adgangskode på databasebrugeren
  • IP-adresse og portnummer for databaseserver

Op til tre former for implementering kan være tilgængelige:

  • Ofte er en sådan implementering en tynd indpakning omkring DriverManager . Hver gang du ringer til DataSource::getConnection på genstanden for en sådan implementering, får du en ny databaseforbindelse.
  • Alternativt kan en implementering bruge en forbindelsespulje nedenunder til at levere allerede eksisterende forbindelser. Disse forbindelser udleveres og tjekkes ind igen, ligesom bøger i et bibliotek, for at blive genbrugt til gentagen brug.
  • En implementering understøtter muligvis Java Transaction API, der understøtter X/Open XA, til sofistikerede behov som koordinering af transaktioner på tværs af flere ressourcer såsom databaser og meddelelseskøer. Ikke så almindeligt brugt, så jeg ignorerer denne type her.

Driver fra jdbc.postgresql.org

Den gratis open source-driver fra jdbc.postgresql.org giver alle tre typer DataSource implementering. Men forfatterne anbefaler ikke at bruge deres forbindelsespuljetype i produktionen; hvis du ønsker pooling, skal du bruge et tredjeparts forbindelsespooling-bibliotek. Og vi ignorerer XA-typen.

Så lad os se på den simple ny-forbindelse-hver-gang implementering af DataSource :org.postgresql.ds.PGSimpleDataSource

Konfiguration af datakildeobjektet

Instantiér et tomt objekt, og kald derefter en række sættermetoder for at konfigurere til dit særlige databasescenarie. Setter-metoderne er nedarvet fra org.postgresql.ds.common.BaseDataSource .

Vi opcaster endnu ikke til grænsefladen DataSource , så vi kan kalde de forskellige setter-metoder. Se eksempelkode og diskussion på siden Datakilder og JNDI.

PGSimpleDataSource ds = new PGSimpleDataSource() ;  // Empty instance.
ds.setServerName( "localhost" );  // The value `localhost` means the Postgres cluster running locally on the same machine.
ds.setDatabaseName( "testdb" );   // A connection to Postgres must be made to a specific database rather than to the server as a whole. You likely have an initial database created named `public`.
ds.setUser( "testuser" );         // Or use the super-user 'postgres' for user name if you installed Postgres with defaults and have not yet created user(s) for your application.
ds.setPassword( "password" );     // You would not really use 'password' as a password, would you?

Generelt ville jeg bruge disse separate setter-metoder. Alternativt konstruerer du en streng, en URL, med de forskellige oplysninger, der skal indstilles på DataSource i et slag. Hvis du vil gå den rute, skal du ringe til setUrl .

Det dækker det grundlæggende. Men du vil måske have eller have brug for nogle af de andre sættere. De fleste af disse sætter Postgres-egenskabsværdier på serveren. Egenskaberne har alle smarte standardindstillinger, men du ønsker måske at tilsidesætte i særlige situationer.

ds.setPortNumber( 6787 ) ;  // If not using the default '5432'.
ds.setApplicationName( "whatever" ) ;   // Identify the application making this connection to the database. Also a clever way to back-door some information to the Postgres server, as you can encode small values into this string for later parsing. 
ds.setConnectTimeout( … ) ;  // The timeout value used for socket connect operations, in whole seconds. If connecting to the server takes longer than this value, the connection is broken.
ds.setSocketTimeout( … ) ;  // The timeout value used for socket read operations. If reading from the server takes longer than this value, the connection is closed. This can be used as both a brute force global query timeout and a method of detecting network problems.
ds.setReadOnly( boolean ) ;  // Puts this connection in read-only mode.

Hvis du bruger TLS (tidligere kendt som SSL) til at kryptere databaseforbindelsen for at beskytte mod aflytning eller ondsindet manipulation, skal du bruge flere sættere til det.

For enhver Postgres-ejendom uden en specifik indstillingsmetode kan du kalde setProperty( PGProperty property, String value ) .

Du kan inspicere eller verificere indstillinger på denne datakilde ved at kalde en af ​​de mange getter-metoder.

Efter at have konfigureret din PGSimpleDataSource , kan du videregive til resten af ​​din kodebase som blot en DataSource objekt. Dette isolerer din kodebase fra chokket ved at skifte til en anden DataSource implementering eller ændring til en anden JDBC-driver.

DataSource dataSource = ds ;  // Upcasting from concrete class to interface.
return dataSource ; 

Brug af datakilden

Brug af en DataSource er fuldstændig enkel, da den kun giver mulighed for to metoder, et par variationer af getConnection for at få en Connection objekt til dit databasearbejde.

Connection conn = dataSource.getConnection() ; 

Når du er færdig med din Connection , bedste praksis er at sørge for at lukke den. Brug enten en prøv-med-ressourcer-syntaks til automatisk at lukke forbindelsen, eller luk den eksplicit.

conn.close() ;

Husk, at en DataSource er faktisk ikke en datakilde. En DataSource er virkelig en kilde til generering/adgang til forbindelser til databasen. Efter min mening er dette en forkert betegnelse, da jeg opfatter det som ConnectionSource . DataSource taler kun med din database længe nok til at logge på med brugernavn og adgangskode. Efter det login bruger du Connection objekt til at interagere med databasen.

Lagring af din DataSource

Når den er konfigureret, vil du beholde den DataSource objekt omkring, cachelagret. Det er ikke nødvendigt at omkonfigurere gentagne gange. Implementeringen skal skrives for at være trådsikker. Du kan ringe til getConnection når som helst fra hvor som helst.

For en simpel lille Java-app vil du måske gemme den som et felt på en singleton eller i en statisk global variabel.

For en Servlet-baseret app såsom en Vaadin app, ville du oprette en klasse, der implementerer ServletContextListener interface. I den klasse ville du etablere din DataSource objekt, når din webapp starter. Derfra gemmer du objektet i ServletContext objekt ved at videregive til setAttribute . Context er den tekniske betegnelse for 'webapp'. Hent ved at kalde getAttribute og casting til DataSource .

I et virksomhedsscenarie er DataSource kan gemmes i en JNDI-kompatibel implementering. Nogle Servlet-containere såsom Apache Tomcat kan give en JNDI-implementering. Nogle organisationer bruger en server såsom en LDAP-server. Registrering og hentning af din DataSource objekt med JNDI er dækket i mange andre spørgsmål og svar på Stack Overflow.




  1. Opret forbindelse til mysql på Amazon EC2 fra en fjernserver

  2. Hvordan opdaterer man en stor tabel med millioner af rækker i SQL Server?

  3. Alt du behøver at vide om kodningsstandarder for SQL-forespørgsler

  4. Joomla SQL Injection sårbarhed