sql >> Databáze >  >> RDS >> PostgreSQL

Programově vytvořte objekt `DataSource` pro Postgres JDBC

tl;dr

PGSimpleDataSource třída spojená s ovladačem JDBC z jdbc.postgresql.org implementuje DataSource rozhraní. Nakonfigurujte podrobnosti o připojení k databázi v PGSimpleDataSource objekt a předat jej jako DataSource objekt.

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

Pomocí tohoto objektu vytvořte připojení k databázi podle potřeby. Použijte pohodlnou syntaxi try-with-resources.

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

Implementace ovladače JDBC

Váš ovladač JDBC vám může poskytnout implementaci DataSource rozhraní.

Objekt této implementace obsahuje informace potřebné k vytvoření a konfiguraci připojení k databázi, jako například:

  • Jméno a heslo uživatele databáze
  • IP adresa a číslo portu databázového serveru

K dispozici mohou být až tři druhy implementace:

  • Taková implementace je často tenkým obalem kolem DriverManager . Pokaždé, když zavoláte DataSource::getConnection na objektu takové implementace získáte nové připojení k databázi.
  • Alternativně může implementace využívat fond připojení pod ním k poskytování již existujících připojení. Tato spojení jsou rozdána a zpětně odevzdána, jako knihy v knihovně, aby byla recyklována pro opakované použití.
  • Implementace může podporovat rozhraní Java Transaction API s podporou X/Open XA pro sofistikované potřeby, jako je koordinace transakcí napříč více zdroji, jako jsou databáze a fronty zpráv. Ne tak běžně používané, takže zde tento typ ignoruji.

Ovladač z jdbc.postgresql.org

Bezplatný open source ovladač z jdbc.postgresql.org poskytuje všechny tři typy DataSource implementace. Autoři však nedoporučují skutečně používat jejich typ fondu připojení ve výrobě; pokud chcete sdružování, použijte knihovnu sdružování připojení od třetí strany. A ignorujeme typ XA.

Pojďme se tedy podívat na jednoduchou implementaci DataSource pro každé nové připojení :org.postgresql.ds.PGSimpleDataSource

Konfigurace objektu zdroje dat

Vytvořte instanci prázdného objektu a poté zavolejte řadu metod setter pro konfiguraci pro váš konkrétní databázový scénář. Metody setter jsou zděděny z org.postgresql.ds.common.BaseDataSource .

Zatím neprovádíme přenos do rozhraní DataSource , takže můžeme volat různé metody setter. Podívejte se na ukázkový kód a diskuzi na stránce Zdroje dat a 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?

Obecně bych použil tyto samostatné metody nastavení. Alternativně vytvoříte řetězec, adresu URL, s různými informacemi, které se mají nastavit na DataSource jedním tahem. Pokud chcete jít touto cestou, zavolejte setUrl .

To pokrývá základy. Ale možná budete chtít nebo potřebovat některé další nastavovače. Většina z nich nastavuje hodnoty vlastností Postgres na serveru. Všechny vlastnosti mají inteligentní výchozí hodnoty, ale ve zvláštních situacích je možná budete chtít přepsat.

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.

Pokud používáte TLS (dříve známý jako SSL) k šifrování databázového připojení k ochraně před odposloucháváním nebo zlovolnou manipulací, použijte k tomu několik setterů.

Pro jakoukoli vlastnost Postgres bez specifické metody setter můžete zavolat setProperty( PGProperty property, String value ) .

Nastavení tohoto zdroje dat můžete zkontrolovat nebo ověřit voláním kterékoli z mnoha metod získávání.

Po konfiguraci PGSimpleDataSource , můžete zbytek své kódové základny předávat jednoduše jako DataSource objekt. To izoluje vaši kódovou základnu před šokem z přechodu na jiný DataSource implementaci nebo změnu na jiný ovladač JDBC.

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

Použití zdroje dat

Pomocí DataSource je naprosto jednoduchý, protože poskytuje pouze dvě metody, pár variací na getConnection získat Connection objekt pro vaši práci s databází.

Connection conn = dataSource.getConnection() ; 

Po dokončení Connection , nejlepší praxí je určitě to zavřít. Buď použijte syntaxi try-with-resources k automatickému uzavření připojení, nebo je zavřete explicitně.

conn.close() ;

Mějte na paměti, že DataSource ve skutečnosti není zdrojem dat. DataSource je skutečně zdrojem pro generování/přístup k připojení k databázi. Podle mého názoru je to nesprávné pojmenování, protože to považuji za ConnectionSource . DataSource komunikuje s vaší databází pouze tak dlouho, aby se přihlásil pomocí uživatelského jména a hesla. Po tomto přihlášení použijete Connection objekt pro interakci s databází.

Ukládání DataSource

Po nakonfigurování si chcete tento DataSource ponechat objekt kolem, v mezipaměti. Není třeba opakovaně konfigurovat. Implementace by měla být napsána tak, aby byla bezpečná pro vlákna. Můžete zavolat getConnection kdykoli a odkudkoli.

U jednoduché malé Java aplikace ji možná budete chtít uložit jako pole na singleton nebo do statické globální proměnné.

Pro aplikaci založenou na Servletu, jako je Vaadin vytvoříte třídu implementující ServletContextListener rozhraní. V této třídě vytvoříte svůj DataSource objekt při spouštění vaší webové aplikace. Odtud byste objekt uložili do ServletContext objekt předáním do setAttribute . Context je technický termín pro „webovou aplikaci“. Načíst voláním getAttribute a odesílání do DataSource .

V podnikovém scénáři DataSource mohou být uloženy v implementaci kompatibilní s JNDI. Některé kontejnery Servlet, jako je Apache Tomcat, mohou poskytovat implementaci JNDI. Některé organizace používají server, jako je server LDAP. Registrace a načítání vašeho DataSource objekt s JNDI je pokryt v mnoha dalších otázkách a odpovědích na Stack Overflow.




  1. Jak nasadit Percona Server pro MySQL pro vysokou dostupnost

  2. Co a kdy mám zadat setFetchSize()?

  3. Jak nakonfigurovat znakovou sadu UTF8 v Oracle?

  4. Oznamujeme Barman 1.0, Backup and Recovery Manager for PostgreSQL