tl;dr
De PGSimpleDataSource
class gebundeld met het JDBC-stuurprogramma van jdbc.postgresql.org implementeert DataSource
koppel. Configureer de gegevens van uw databaseverbinding in een PGSimpleDataSource
object, en doorgeven als een DataSource
voorwerp.
PGSimpleDataSource ds = new PGSimpleDataSource() ;
ds.setServerName( "localhost" );
ds.setDatabaseName( "your_db_name_here" );
ds.setUser( "scott" );
ds.setPassword( "tiger" );
Gebruik dat object om indien nodig een verbinding met de database tot stand te brengen. Gebruik handige try-with-resources-syntaxis.
try
(
Connection conn = ds.getConnection() ;
)
{ … }
Implementatie van JDBC-stuurprogramma
Uw JDBC-stuurprogramma kan u voorzien van een implementatie van de DataSource
interface.
Een object van deze implementatie bevat de informatie die nodig is om een verbinding met de database te maken en te configureren, zoals:
- Naam en wachtwoord van databasegebruiker
- IP-adres &poortnummer van databaseserver
Er kunnen maximaal drie soorten implementatie beschikbaar zijn:
- Vaak is zo'n implementatie een dunne wikkel rond de
DriverManager
. Elke keer dat uDataSource::getConnection
. aanroept op het object van een dergelijke implementatie krijg je een nieuwe databaseverbinding. - Als alternatief kan een implementatie een verbindingspool eronder gebruiken om reeds bestaande verbindingen te leveren. Deze verbindingen worden uitgedeeld en weer ingecheckt, zoals boeken in een bibliotheek, om te worden gerecycled voor herhaald gebruik.
- Een implementatie kan de Java Transaction API ondersteunen, die X/Open XA ondersteunt, voor geavanceerde behoeften zoals het coördineren van de transacties over meerdere bronnen, zoals databases en berichtenwachtrijen. Niet zo vaak gebruikt, dus ik negeer dit type hier.
Stuurprogramma van jdbc.postgresql.org
De gratis open-source driver van jdbc.postgresql.org biedt alle drie de typen DataSource
implementatie. Maar de auteurs raden niet aan om hun type verbindingspool daadwerkelijk in productie te gebruiken; als u pooling wilt, gebruikt u een poolingbibliotheek voor verbindingen van derden. En we negeren het XA-type.
Laten we dus eens kijken naar de eenvoudige implementatie van DataSource
elke keer opnieuw. :org.postgresql.ds.PGSimpleDataSource
Het gegevensbronobject configureren
Instantieer een leeg object en roep vervolgens een reeks setter-methoden aan om te configureren voor uw specifieke databasescenario. De setter-methoden zijn overgenomen van org.postgresql.ds.common.BaseDataSource
.
We zijn nog niet aan het upcasten naar de interface DataSource
, zodat we de verschillende setter-methoden kunnen noemen. Zie voorbeeldcode en discussie op de pagina Gegevensbronnen en 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?
Over het algemeen zou ik deze afzonderlijke setter-methoden gebruiken. U kunt ook een String, een URL, maken met de verschillende stukjes informatie die moeten worden ingesteld op de DataSource
in één slag. Als je die route wilt gaan, bel dan setUrl
.
Dat dekt de basis. Maar misschien wilt u of heeft u enkele van de andere setters nodig. De meeste hiervan zijn het instellen van Postgres-eigenschapswaarden op de server. De eigenschappen hebben allemaal slimme standaardinstellingen, maar voor speciale situaties wilt u deze misschien overschrijven.
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.
Als u TLS (voorheen bekend als SSL) gebruikt om de databaseverbinding te versleutelen ter bescherming tegen afluisteren of kwaadwillende manipulatie, gebruik dan meerdere instellingen daarvoor.
Voor elke Postgres-eigenschap zonder een specifieke settermethode, kunt u setProperty( PGProperty property, String value )
aanroepen .
U kunt de instellingen van deze gegevensbron inspecteren of verifiëren door een van de vele getter-methoden aan te roepen.
Na het configureren van uw PGSimpleDataSource
, kunt u doorgeven aan de rest van uw codebase als een DataSource
voorwerp. Dit isoleert uw codebase tegen de schok van het overstappen naar een andere DataSource
implementatie of overstappen op een ander JDBC-stuurprogramma.
DataSource dataSource = ds ; // Upcasting from concrete class to interface.
return dataSource ;
De gegevensbron gebruiken
Een DataSource
gebruiken is uiterst eenvoudig omdat het slechts twee methoden biedt, een paar variaties op getConnection
om een Connection
te krijgen object voor uw databasewerk.
Connection conn = dataSource.getConnection() ;
Wanneer u klaar bent met uw Connection
, is het beste om het te sluiten. Gebruik ofwel een try-with-resources-syntaxis om de verbinding automatisch te sluiten, of sluit deze expliciet.
conn.close() ;
Houd in gedachten dat een DataSource
is eigenlijk geen gegevensbron. Een DataSource
is echt een bron voor het genereren van/toegang krijgen tot verbindingen met de database. Naar mijn mening is dit een verkeerde benaming, omdat ik het zie als ConnectionSource
. De DataSource
praat alleen lang genoeg met uw database om in te loggen met gebruikersnaam en wachtwoord. Na die aanmelding gebruikt u de Connection
object om met de database te communiceren.
Uw DataSource
opslaan
Eenmaal geconfigureerd, wil je die DataSource
. behouden object rond, in de cache. Het is niet nodig om herhaaldelijk opnieuw te configureren. De implementatie moet worden geschreven om thread-safe te zijn. U kunt getConnection
call bellen altijd en overal.
Voor een eenvoudige kleine Java-app wil je deze misschien opslaan als een veld op een singleton of in een statische globale variabele.
Voor een op Servlet gebaseerde app zoals een Vaadin app, zou u een klasse maken die ServletContextListener
. implementeert koppel. In die klasse zou je je DataSource
. bepalen object wanneer uw web-app wordt gestart. Van daaruit zou je het object opslaan in de ServletContext
object door door te geven aan setAttribute
. Context
is de technische term voor 'webapp'. Ophalen door getAttribute
. te bellen en casten naar DataSource
.
In een ondernemingsscenario is de DataSource
kan worden opgeslagen in een JNDI-compatibele implementatie. Sommige Servlet-containers zoals Apache Tomcat bieden mogelijk een JNDI-implementatie. Sommige organisaties gebruiken een server zoals een LDAP-server. Uw DataSource
registreren en ophalen object met JNDI wordt behandeld in vele andere vragen en antwoorden op Stack Overflow.