PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Łączenie z Heroku Postgres z Spring Boot

Najprostszy i najczystszy sposób na Spring Boot 2.x z Heroku i Postgres

Przeczytałem wszystkie odpowiedzi, ale nie znalazłem tego, czego szukał Jonik:

Szukam najprostszego, najczystszego sposobu łączenia się z HerokuPostgres w aplikacji Spring Boot przy użyciu JPA/Hibernacji

Proces rozwoju, którego większość ludzi chce używać z Spring Boot &Heroku, obejmuje lokalną bazę danych H2 w pamięci do testowania i szybkich cykli rozwoju – oraz bazę danych Heroku Postgres do testowania i produkcji w Heroku.

  • Po pierwsze – nie musisz do tego używać profili Spring!
  • Po drugie:nie musisz pisać/zmieniać żadnego kodu!

Przyjrzyjmy się krok po kroku, co musimy zrobić. Mam przykładowy projekt, który zapewnia w pełni działające wdrożenie i konfigurację Heroku dla Postgresa - tylko ze względu na kompletność, jeśli chcesz sam to przetestować:github.com/jonashackt/spring-boot-vuejs.

Pom.xml

Potrzebujemy następujących zależności:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- In-Memory database used for local development & testing -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>

    <!-- Switch back from Spring Boot 2.x standard HikariCP to Tomcat JDBC,
    configured later in Heroku (see https://stackoverflow.com/a/49970142/4964553) -->
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jdbc</artifactId>
    </dependency>

    <!-- PostgreSQL used in Staging and Production environment, e.g. on Heroku -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.2</version>
    </dependency>

Jedną trudną rzeczą jest użycie tomcat-jdbc , ale omówimy to za sekundę.

Konfiguruj zmienne środowiskowe w Heroku

W Heroku zmienne środowiskowe nazywają się Config Vars . Dobrze słyszałeś, wszystko, co musimy zrobić, to skonfigurować zmienne środowiskowe! Potrzebujemy tylko właściwych. Dlatego przejdź do https://data.heroku.com/ (zakładam, że istnieje już baza danych Postgres skonfigurowana dla twojej aplikacji Heroku, co jest zachowaniem domyślnym).

Teraz kliknij odpowiedni Datastore swojej aplikacji i przejdź do Settings patka. Następnie kliknij View Credentials... , który powinien wyglądać podobnie do tego:

Teraz otwórz nową kartę przeglądarki i przejdź do Settings aplikacji Heroku zakładka również. Kliknij Reveal Config Vars i utwórz następujące zmienne środowiskowe:

  • SPRING_DATASOURCE_URL =jdbc :postgresql ://TwójPostgresHerokuHostNameHere :5432/Twoja baza danychPostgresHerokuNameHere (uwaga na wiodący jdbc: i ql dodatek do postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameHere
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordHere
  • SPRING_DATASOURCE_DRIVER-CLASS-NAME =org.postgresql.Driver (nie zawsze jest to potrzebne, ponieważ Spring Boot może to wywnioskować dla większości baz danych z adresu URL, tylko dla kompletności tutaj)
  • SPRING_JPA_DATABASE-PLATFORM =org.hibernate.dialect.PostgreSQLDialect
  • SPRING_DATASOURCE_TYPE =org.apache.tomcat.jdbc.pool.DataSource
  • SPRING_JPA_HIBERNATE_DDL-AUTO =update (spowoduje to automatyczne utworzenie tabel zgodnie z encjami JPA, co jest naprawdę świetne - ponieważ nie musisz przeszkadzać w CREATE instrukcje SQL lub pliki DDL)

W Heroku powinno to wyglądać tak:

Teraz to wszystko, co musisz zrobić! Twoja aplikacja Heroku jest uruchamiana ponownie za każdym razem, gdy zmieniasz zmienną konfiguracyjną - więc Twoja aplikacja powinna teraz działać lokalnie w H2 i powinna być gotowa do połączenia z PostgreSQL po wdrożeniu w Heroku.

Tylko jeśli pytasz:dlaczego konfigurujemy Tomcat JDBC zamiast Hikari

Jak zapewne zauważyłeś, dodaliśmy tomcat-jdbc zależność od naszego pom.xml i skonfigurowany SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource jako zmienna środowiskowa. W dokumentach jest tylko niewielka wskazówka na temat tego powiedzenia

Można całkowicie ominąć ten algorytm i określić pulę połączeń, która ma być używana, ustawiając właściwość spring.datasource.type. Jest to szczególnie ważne, jeśli uruchamiasz aplikację w kontenerze Tomcat, ...

Jest kilka powodów, dla których wróciłem do Tomcat pooling DataSource zamiast używać standardowego HikariCP Spring Boot 2.x. Jak już wyjaśniłem tutaj, jeśli nie określisz spring.datasource.url , Spring spróbuje automatycznie podłączyć wbudowaną bazę danych im-memory H2 zamiast naszej bazy PostgreSQL. Problem z Hikari polega na tym, że obsługuje tylko spring.datasource.jdbc-url .

Po drugie, jeśli spróbuję użyć konfiguracji Heroku, jak pokazano dla Hikari (więc pomijam SPRING_DATASOURCE_TYPE i zmiana SPRING_DATASOURCE_URL na SPRING_DATASOURCE_JDBC-URL ) Natrafiam na następujący wyjątek:

Caused by: java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

Więc nie dostałem Spring Boot 2.x działającego na Heroku i Postgres z HikariCP, ale z Tomcat JDBC - i nie chcę też hamować mojego procesu rozwoju zawierającego lokalną bazę danych H2 opisaną z góry. Pamiętaj:Szukaliśmy najprostszego, najczystszego sposobu łączenia się z Heroku Postgres w aplikacji Spring Boot przy użyciu JPA/Hibernacji!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najlepsze narzędzia GUI dla PostgreSQL

  2. brak wpisu klauzuli FROM dla tabeli Grupo cakephp

  3. „O” w ORDBMS:Dziedziczenie PostgreSQL

  4. Jak działa justify_days() w PostgreSQL

  5. Wywołanie procedury składowanej w ramach procedury składowanej