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

Свързване с Heroku Postgres от Spring Boot

Най-простият най-чист начин за Spring Boot 2.x с Heroku &Postgres

Прочетох всички отговори, но не намерих това, което Йоник търсеше:

Търся най-простия и чист начин за свързване с HerokuPostgres в приложение за Spring Boot с помощта на JPA/Hibernate

Процесът на разработка, който повечето хора искат да използват с Spring Boot &Heroku, включва локална база данни H2 в паметта за тестване и бързи цикли на разработка - и базата данни Heroku Postgres за поставяне и производство на Heroku.

  • Първото нещо е – не е нужно да използвате Spring профили за това!
  • Второ:Не е нужно да пишете/променяте код!

Нека да разгледаме какво трябва да направим стъпка по стъпка. Имам примерен проект, който осигурява напълно работещо разгръщане и конфигурация на Heroku за Postgres – само за пълнота, ако искате да го тествате сами:github.com/jonashackt/spring-boot-vuejs.

Pom.xml

Нуждаем се от следните зависимости:

    <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>

Едно сложно нещо тук е използването на tomcat-jdbc , но ще покрием това след секунда.

Конфигуриране на променливи на средата на Heroku

В Heroku променливите на средата са наречени Config Vars . Чухте правилно, всичко, което трябва да направим, е да конфигурираме променливите на средата! Трябват ни само правилните. Затова отидете на https://data.heroku.com/ (предполагам, че вече има Postgres база данни, конфигурирана за вашето приложение Heroku, което е поведението по подразбиране).

Сега щракнете върху съответното Datastore на вашето приложение и преминете към Settings раздел. След това щракнете върху View Credentials... , което трябва да изглежда нещо подобно:

Сега отворете нов раздел на браузъра и отидете на Settings на вашето приложение Heroku раздел също. Щракнете върху Reveal Config Vars и създайте следните променливи на средата:

  • SPRING_DATASOURCE_URL =jdbc :postgresql ://YourPostgresHerokuHostNameТук :5432/YourPostgresHerokuDatabaseNameТук (имайте предвид водещия jdbc: и ql допълнение към postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameHere
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPassword Тук
  • SPRING_DATASOURCE_DRIVER-CLASS-NAME =org.postgresql.Driver (това не винаги е необходимо, тъй като Spring Boot може да го изведе за повечето бази данни от URL адреса, само за пълнота тук)
  • SPRING_JPA_DATABASE-PLATFORM =org.hibernate.dialect.PostgreSQLDialect
  • SPRING_DATASOURCE_TYPE =org.apache.tomcat.jdbc.pool.DataSource
  • SPRING_JPA_HIBERNATE_DDL-AUTO =update (това автоматично ще създаде вашите таблици според вашите JPA обекти, което е наистина страхотно - тъй като не е нужно да препятствате с CREATE SQL изрази или DDL файлове)

В Heroku това трябва да изглежда така:

Сега това е всичко, което трябва да направите! Вашето приложение Heroku се рестартира всеки път, когато промените конфигурационна променлива – така че приложението ви вече трябва да работи H2 локално и трябва да е готово да се свърже с PostgreSQL, когато се внедри на Heroku.

Само ако питате:Защо конфигурираме Tomcat JDBC вместо Hikari

Както може би сте забелязали, добавихме tomcat-jdbc зависимост от нашия pom.xml и конфигуриран SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource като променлива на околната среда. В документите има само лек намек за тази поговорка

Можете да заобиколите този алгоритъм напълно и да посочите пула за връзки, който да използвате, като зададете свойството spring.datasource.type. Това е особено важно, ако стартирате приложението си в контейнер Tomcat, ...

Има няколко причини да се върна към Tomcat обединяващ DataSource вместо да използвам стандартния HikariCP Spring Boot 2.x. Както вече обясних тук, ако не посочите spring.datasource.url , Spring ще се опита да свърже автоматично вградената база данни с im-memory H2 вместо нашата PostgreSQL. И проблемът с Hikari е, че поддържа само spring.datasource.jdbc-url .

Второ, ако се опитам да използвам конфигурацията на Heroku, както е показано за Hikari (така че пропускам SPRING_DATASOURCE_TYPE и промяна на SPRING_DATASOURCE_URL към SPRING_DATASOURCE_JDBC-URL ) Сблъсквам се със следното изключение:

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

Така че не накарах Spring Boot 2.x да работи върху Heroku &Postgres с HikariCP, а с Tomcat JDBC - и също така не искам да спирам процеса на разработка, съдържащ локална база данни H2, описана предварително. Запомнете:търсихме най-простия и чист начин за свързване с Heroku Postgres в приложение Spring Boot с помощта на JPA/Hibernate!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. HikariCP - връзката не е налична

  2. Грешка при създаването на пространствена база данни. ГРЕШКА:не можа да се зареди библиотеката /usr/pgsql-9.1/lib/rtpostgis-2.0.so

  3. Каква е разликата между `->>` и `->` в Postgres SQL?

  4. Кога можем да използваме идентификационен номер вместо неговото име в PostgreSQL?

  5. Как да изчислим разликата между две времеви марки в PostgreSQL