PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Създайте обект `DataSource` за Postgres JDBC, програмно

tl;dr

PGSimpleDataSource клас в комплект с JDBC драйвера от jdbc.postgresql.org прилага DataSource интерфейс. Конфигурирайте подробностите за връзката на вашата база данни в PGSimpleDataSource обект и го предават като DataSource обект.

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

Използвайте този обект, за да направите връзка с базата данни, ако е необходимо. Използвайте удобен синтаксис за изпробване с ресурси.

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

Внедряване на JDBC драйвер

Вашият JDBC драйвер може да ви предостави реализация на DataSource интерфейс.

Обект на тази реализация съдържа информацията, необходима за осъществяване и конфигуриране на връзка с базата данни, като например:

  • Име и парола на потребителя на базата данни
  • IP адрес и номер на порт на сървъра на базата данни

Възможно е да са налични до три вида внедряване:

  • Често такава реализация е тънка обвивка около DriverManager . Всеки път, когато извикате DataSource::getConnection на обекта на такава реализация получавате нова връзка с базата данни.
  • Алтернативно една реализация може да използва пул за връзки отдолу за предоставяне на вече съществуващи връзки. Тези връзки се раздават и чекират отново, като книги в библиотека, за да бъдат рециклирани за многократна употреба.
  • Една реализация може да поддържа API за транзакции на Java, поддържащ X/Open XA, за сложни нужди като координиране на транзакциите в множество ресурси, като бази данни и опашки за съобщения. Не е толкова често използван, затова игнорирам този тип тук.

Драйвер от jdbc.postgresql.org

Безплатният драйвер с отворен код от jdbc.postgresql.org предоставя и трите типа DataSource изпълнение. Но авторите не препоръчват действително да използвате техния тип пул за връзки в производството; ако искате обединяване, използвайте библиотека за обединяване на връзки на трета страна. И игнорираме типа XA.

Така че нека да разгледаме простото изпълнение на DataSource при всяко прясно свързване. :org.postgresql.ds.PGSimpleDataSource

Конфигуриране на обекта източник на данни

Инстанцирайте празен обект, след което извикайте серия от методи за настройка, които да конфигурирате за вашия конкретен сценарий на база данни. Методите за настройка са наследени от org.postgresql.ds.common.BaseDataSource .

Все още не надграждаме към интерфейса DataSource , за да можем да извикаме различните методи за настройка. Вижте примерен код и дискусия на страницата Източници на данни и 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?

Обикновено бих използвал тези отделни методи за настройка. Като алтернатива, вие създавате низ, URL, с различните части от информация, които да бъдат зададени в DataSource с един удар. Ако искате да отидете по този маршрут, извикайте setUrl .

Това обхваща основите. Но може да искате или имате нужда от някои от другите сетери. Повечето от тях задават стойности на свойствата на Postgres на сървъра. Всички свойства имат интелигентни настройки по подразбиране, но може да пожелаете да отмените за специални ситуации.

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.

Ако използвате TLS (по-рано известен като SSL) за криптиране на връзката към базата данни, за да се предпазите от подслушване или злонамерена манипулация, използвайте няколко инструмента за настройка за това.

За всяко свойство на Postgres без конкретен метод за настройка, можете да извикате setProperty( PGProperty property, String value ) .

Можете да проверите или потвърдите настройките на този източник на данни, като извикате някой от многото методи за получаване.

След като конфигурирате вашия PGSimpleDataSource , можете да преминете към останалата част от вашата кодова база просто като DataSource обект. Това изолира вашата кодова база от шока от промяна към друг DataSource внедряване или промяна на друг JDBC драйвер.

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

Използване на източника на данни

Използване на DataSource е напълно проста, тъй като предоставя само два метода, двойка вариации на getConnection за да получите Connection обект за работата на вашата база данни.

Connection conn = dataSource.getConnection() ; 

Когато приключите с вашата Connection , най-добрата практика е да не забравяйте да го затворите. Или използвайте синтаксис за пробване с ресурси, за да затворите автоматично връзката, или я затворете изрично.

conn.close() ;

Не забравяйте, че DataSource всъщност не е източник на данни. DataSource е наистина източник за генериране/достъп до връзки към базата данни. Според мен това е погрешно наименование, тъй като го мисля като ConnectionSource . DataSource говори с вашата база данни достатъчно дълго, за да влезете с потребителско име и парола. След това влизане използвате Connection обект за взаимодействие с базата данни.

Съхранение на вашия DataSource

След като бъде конфигуриран, искате да запазите този DataSource обект наоколо, кеширан. Няма нужда от повторно конфигуриране многократно. Реализацията трябва да бъде написана така, че да е нишобезопасна. Можете да извикате getConnection по всяко време отвсякъде.

За обикновено малко приложение на Java може да искате да го съхраните като поле в единичен елемент или в статична глобална променлива.

За приложение, базирано на Servlet, като Vaadin app, бихте създали клас, внедряващ ServletContextListener интерфейс. В този клас ще установите своя DataSource обект, когато вашето уеб приложение се стартира. От там ще съхраните обекта в ServletContext обект чрез преминаване към setAttribute . Context е техническият термин за „уеб приложение“. Извлечете чрез извикване на getAttribute и прехвърляне към DataSource .

В корпоративен сценарий, DataSource може да се съхранява в JNDI-съвместима реализация. Някои контейнери на Servlet, като Apache Tomcat, могат да осигурят JNDI реализация. Някои организации използват сървър като LDAP сървър. Регистриране и извличане на вашия DataSource обект с JNDI е обхванат в много други въпроси и отговори за препълване на стека.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. как мога да създам нов XML файл от съществуваща база данни в PostgreSQL база данни с помощта на java

  2. Оптимизация на заявки в PostgreSQL. EXPLAIN Basics – Част 2

  3. Топ 5 PostgreSQL инструменти за наблюдение на заявки

  4. Как cbrt() работи в PostgreSQL

  5. Преглед на възможностите на JSON в PostgreSQL