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áteDataSource::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.