JavaRush /Java-Blog /Random-DE /Wir fügen alles hinzu, was mit der Datenbank zu tun hat. ...

Wir fügen alles hinzu, was mit der Datenbank zu tun hat. (Teil 1) - „Java-Projekt von A bis Z“

Veröffentlicht in der Gruppe Random-DE
Schritt für Schritt kommen wir unserem Ziel näher. „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 1Heute müssen wir viele Aufgaben lösen:
  1. Flyway hinzufügen. Hier konfigurieren wir die Bereitstellung der Datenbank für das Projekt.
  2. Fügen Sie ein Datenbankschema hinzu.
  3. Fügen Sie eine Repository-Ebene hinzu.
  4. Fügen Sie einen Befehl für Bot-Statistiken hinzu.
  5. Schreiben Sie schließlich Tests.
Also lehnen Sie sich zurück, lehnen Sie sich zurück, es wird eine lange Lektüre geben. Wir haben bereits gelernt , wie wir unsere Anwendung mit Docker und Docker-Compose bereitstellen . Es war nicht einfach und herzlichen Glückwunsch an diejenigen, die es geschafft haben. Wenn Sie Fragen zur Implementierung haben, können Sie sich den Code in diesem Pull-Request ansehen .

Flyway hinzufügen

Um Flyway hinzuzufügen, benötigen Sie eine Datenbank, die wir als weiteren Dienst in Docker-Compose hinzufügen. Letztes Mal habe ich gesagt, dass Docker-Compose über einen Service-Bereich verfügt, der genau für das Hinzufügen und Verwalten einer bestimmten Infrastruktur verantwortlich ist, also einer Reihe von Anwendungen/Datenbanken/Messengern usw.
Ich habe bereits darüber gesprochen, was Flyway ist und wie man es zu einer SpringBoot-Anwendung hinzufügt . Ich rate Ihnen, Ihr Gedächtnis aufzufrischen, bevor Sie diesen Artikel lesen. Sie können auch die Projektdatei README.md mit einer Demonstration eines Artikels über Flyway + SpringBoot lesen.
Als Erstes aktualisieren wir unseren Hauptzweig im Projekt (git pull) und erstellen einen neuen mit dem Namen unserer Aufgabe – STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Ich möchte Sie daran erinnern: Wir haben die Zweige umbenannt, damit die Reihenfolge der Aufgaben im Projekt nur nach Namen sortiert werden konnte. Dadurch können Sie schnell von einem Schritt zum nächsten wechseln. Jetzt können Sie in Ruhe arbeiten. Wir müssen drei Abhängigkeiten hinzufügen:
<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Die erste Abhängigkeit ist für das Hinzufügen von FlyWay zum Projekt verantwortlich, die zweite fügt die Möglichkeit hinzu, eine Verbindung zur MySQL-Datenbank herzustellen. Der dritte ist der SpringBoot-Starter, der die ganze Magie der Verwendung einer Datenbank in Spring auslöst. Und fügen wir auch einen Lombok hinzu, um keine Getter und Setter zu schreiben:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Jetzt brauchen wir eine Datenbank für die Entwicklung. Wir werden es vorerst ( bis ich eine bessere Idee habe ) als separate Docker-Compose-Datei und eine separate Datei für application.properties erstellen. In der Entwicklung (und insbesondere im Spring-Ökosystem) gibt es so etwas wie Profile. Je nach Profil werden unterschiedliche Einstellungen für den Betrieb gestartet. Ich denke, in Zukunft werden wir Docker-Compose in einer Datei zusammenfassen und sicherstellen, dass nur eine Datenbank für die Entwicklung mit den Einstellungen gestartet wird, die wir benötigen. Im Moment machen wir Folgendes:
  1. Erstellen wir eine Datei im Stammverzeichnis des Projekts docker-compose-test.yml, in der nur die Datenbank mit ihren eigenen Einstellungen gestartet wird.
  2. Erstellen wir eine Datei „application-test.properties“ mit Einstellungen, die mit den Einstellungen in der Datei „docker-compose-test.yml“ übereinstimmen.
Um mit MySQL zu arbeiten, habe ich das offizielle Image von DockerHub genommen : „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 2Nach schnellem Scrollen habe ich die notwendigen Variablen gefunden: MYSQL_DATABASE – Datenbankname MYSQL_USER – Datenbankbenutzername MYSQL_PASSWORD – Datenbankbenutzerkennwort Und wie sie richtig geschrieben werden müssen:
jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
Danach erstelle ich docker-compose-test.yml im Projektstamm:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
Um diese bestimmte Datei für die Arbeit mit Docker-Compose auszuführen, müssen Sie das Flag -f in der Anfrage verwenden . Dies bedeutet, dass der Name der gestarteten Datei bereitgestellt wird und nicht die standardmäßige docker-compose.yml. Daher sieht die Anfrage so aus: docker-compose -f docker-compose-test.yml up -d Es stellt sich heraus, dass wir zuerst sagen, welche Datei wir nehmen sollen ( -f docker-compose-test.yml ), und dann wir Angenommen, wir müssen Dienste auslösen und dies im Daemon-Modus ( up -d ) tun – das heißt, dass der Prozess außerhalb der Terminalsitzung ausgeführt wird, in der dieser Befehl gestartet wurde. Wir starten die Datenbank und versuchen, eine Verbindung herzustellen, um sicherzustellen, dass sie aktiv ist und verwendet werden kann. Öffnen Sie dazu die bekannte MySQL Workbench ( hier haben wir darüber gesprochen ) und erstellen Sie eine neue Verbindung: „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 3Wir müssen die folgenden Felder ausfüllen:
  • Verbindungsname – Verbindungsname – optional DEV_JRTB_DB;
  • Hostname – hier ist die Adresse, unter der die Datenbank bereitgestellt wird. In unserem Fall bleibt alles so wie es war: 127.0.0.1 oder localhost;
  • Benutzername – hier wird root sein, wie wir in Docker-Compose geschrieben haben;
  • Passwort - auch root.
Anschließend müssen Sie prüfen, ob eine Verbindung besteht. Klicken Sie dazu auf Verbindung testen : „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 4Als Ergebnis erhalten wir: Verbindung zu MySQL konnte nicht hergestellt werden... Warum? Wir gehen zum Terminal und sehen, was mit dem Docker-Container passiert ist. Schreiben wir in das Terminal: „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 5Wir sehen, dass das Terminal vor 59 Minuten erstellt wurde und der Neustart 55 Sekunden dauerte ... warum? Es ist nicht klar, Sie müssen sich die Protokolle ansehen. Gehen Sie im Terminal zum Projektstammverzeichnis und führen Sie den folgenden Befehl aus: docker-compose -f docker-compose-test.yml logs
Wir bekommen:

dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

Jetzt ist klar, dass die Datenbank mit unseren Einstellungen nie gestartet ist. Der Fehler ist derselbe, also isolieren wir ihn vom Blatt:
28.02.2021 11:03:37+00:00 [FEHLER] [Einstiegspunkt]: Datenbank ist nicht initialisiert und Passwortoption ist nicht angegeben dev-jrtb-db | Sie müssen eines von MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD und MYSQL_RANDOM_ROOT_PASSWORD angeben
Das heißt, er muss das Passwort für den Root-Benutzer – den Hauptbenutzer – ermitteln. Okay, jetzt aktualisieren wir unsere Datei:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_ROOT_PASSWORD: root
Wir haben diese Variablen für den Benutzer und das Passwort entfernt und nur das Passwort für den Root-Benutzer hinzugefügt. Das bedeutet, dass der Root-Benutzer nun ein Root-Passwort hat. Zumindest gehen wir davon aus. Lassen Sie es uns nun ausführen und sehen, was passiert: docker-compose -f docker-compose-test.yml up -d Und sehen Sie sofort, was uns die Protokolle sagen: docker-compose -f docker-compose-test.yml logs
Lass uns nachsehen:

Attaching to dev-jrtb-db dev-jrtb-db | 2021-02-28 11:20:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Initializing database files dev-jrtb-db | 2021-02-28T11:20:41.083803Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.23) initializing of server in progress as process 43 dev-jrtb-db | 2021-02-28T11:20:41.088457Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:41.447990Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:42.672093Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Database files initialized dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Starting temporary server dev-jrtb-db | 2021-02-28T11:20:45.893664Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 88 dev-jrtb-db | 2021-02-28T11:20:45.921695Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:46.088339Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:46.207499Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:46.369170Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:46.369357Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:46.371501Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:46.402227Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:46+00:00 [Note] [Entrypoint]: Temporary server started. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Creating database dev_jrtb_db dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Stopping temporary server dev-jrtb-db | 2021-02-28T11:20:49.187996Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23). dev-jrtb-db | 2021-02-28T11:20:50.925075Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: Temporary server stopped dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. dev-jrtb-db | dev-jrtb-db | 2021-02-28T11:20:51.420058Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1 dev-jrtb-db | 2021-02-28T11:20:51.427384Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:51.577244Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:51.677659Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:51.787156Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:51.787325Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:51.789742Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:51.812100Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

Es scheinen keine Fehler mehr vorzuliegen, sodass Sie sehen können, ob ein Zugriff möglich ist. Aber leider gibt es wieder keinen Zugriff... Nichts: Wir werden das noch weiter klären! „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 6Um Docker-Compose zu beenden und alle Container zu löschen, müssen Sie Folgendes schreiben: docker-compose -f docker-compose-test.yml down Hier haben wir die zu löschende Datei angegeben. Was zu tun ist? Googeln wir mal: Vielleicht hat es jemand besser gemacht. Die einfachste Abfrage: „Beispiel für MySQL in Docker-Compose“ hilft uns, einen Link zu einer Medium-Ressource zu finden. Sie geben dieses Beispiel:
version: '3.3'
services:
 db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'password'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
     # Opens port 3306 on the container
     - '3306'
     # Where our data will be persisted
   volumes:
     - my-db:/var/lib/mysql
# Names our volume
volumes:
 my-db:
Wir passen es an unsere Bedürfnisse an und erhalten:
version: '3.1'

services:
 jrtb-db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'dev_jrtb_db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'dev_jrtb_db_user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'dev_jrtb_db_password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'root'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
       # Opens port 3306 on the container
       - '3306'
Wir starten diese Option mit dem uns bereits bekannten Befehl: docker-compose -f docker-compose-test.yml up -d Wir versuchen erneut, über MySQLWorkBench auf die Datenbank zuzugreifen: „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 7Endlich ist der Zugriff aufgetreten. Aber jetzt frage ich mich, was das beeinflusst hat. Ich sündige in diesem Teil:
expose:
   # Opens port 3306 on the container
   - '3306'
Man kann es leicht überprüfen: Ohne das sollte nichts funktionieren :D. Überprüfen wir: Löschen Sie diesen Teil, starten Sie Docker-Compose neu: Docker-Compose -f Docker-Compose-Test.yml Down Docker-Compose -f Docker-Compose-Test.yml Up Wir versuchen, uns über Workbench in die Datenbank einzuloggen: Alles ist Bußgeld. Dann ist die einzige Option die Datenbankversion. Es steht eindeutig 5.7, das heißt, wenn Sie es auf die neueste Version ändern, sollte es nicht funktionieren. Ich habe es neu gestartet – und es funktioniert wirklich nicht ... „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 8Anscheinend haben sie in der neuesten Version einige Probleme mit dem Docker-Image. Okay, kein Problem. Dies passiert häufig bei kostenloser Software. Wir werden Version 5.7 verwenden. Mal sehen, ob es eine Datenbank gibt, die wir brauchen – dev_jrtb_db. Führen Sie dazu den Query-Befehl in MySQL Workbench aus. SHOW DATABASES : „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 9Ja, es ist in der Ausgabe vorhanden. Großartig, wir können weitermachen. Als nächstes fügen wir unsere erste Migration hinzu. Basierend auf den Aufgaben aus dem Artikel „Projektplanung: Zweimal messen, einmal schneiden“ erstellen wir unsere erste Tabelle tg_user. Alle Migrationen befinden sich im Ordner projectDir/src/main/resources/db/migration und der Name lautet: V00001__add_tg_user_table.sql . Warum es in diesem Ordner einen solchen Namen gibt – ich habe es im Artikel über Spring + Flyway beschrieben. So wird unsere erste Migration aussehen: V00001__add_tg_user_table.sql:
-- ensure that the table with this name is removed before creating a new one.
DROP TABLE IF EXISTS tg_user;

-- Create tg_user table
CREATE TABLE tg_user (
   chat_id VARCHAR(100),
   active BOOLEAN
);
Das heißt, wir erstellen hier einfach eine Tabelle eines Benutzers, der nur eine Chat-ID (ein eindeutiges Element, das als ID in der Tabelle verwendet werden kann) und seinen Status – aktiv oder inaktiv – hat. Wenn also der Bot gestoppt wird, bleiben die Abonnementinformationen erhalten und können verwendet werden, wenn sie den Bot erneut verwenden möchten. Weitere Informationen über den Benutzer sind vorerst nicht erforderlich. Nun die Hauptfrage: Wie kann man das überprüfen? Wir müssen unsere Anwendung starten. Bisher hat die Hauptdatei „docker-compose.yml“ keine Verbindung mit der Datenbank und wir müssen auch lernen, wie wir die Anwendung zusammen mit der Datenbank debuggen. Starten wir daher die Anwendung mit Intellij IDEA. Um dies zu testen, müssen wir unsere Hauptmethode in JavarushTelegramBotApplication ausführen. Um die Arbeit der Bereitstellung und des Tests zu trennen, verwenden wir eine andere Datei mit Eigenschaften – application-test.properties . Mit dieser Vorlage teilen wir Spring mit, dass diese Datei für das Testprofil verwendet wird . Wenn wir kein Profil angeben, wird das Standardprofil verwendet (überprüfen Sie dies in Ihren Protokollen, wenn Sie SpringBoot ausführen: darüber wird in den ersten Zeilen geschrieben). So wird es aussehen:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://localhost:3306/dev_jrtb_db
spring.datasource.username=dev_jrtb_db_user
spring.datasource.password=dev_jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=tes
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
Und die Hauptanwendungseigenschaften werden etwas anders aussehen:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://jrtb-db:3306/jrtb_db
spring.datasource.username=jrtb_db_user
spring.datasource.password=jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=test.javarush_community_bot
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
Der wesentliche Unterschied liegt im Feld spring.datasource.url: Im Testprofil haben wir eine URL auf localhost . Das heißt, es wird erwartet, dass die Anwendung außerhalb von Docker ausgeführt wird, was wahr ist, denn beim Debuggen führen wir unser Projekt in Intellij IDEA aus und erwarten, dass wir vom lokalen Computer aus Zugriff auf die Datenbank haben. Aber die application.properties-URL enthält bereits eine andere – jrtb-db . Dies wird der Name unserer Datenbank in Docker-Compose sein, und auf diese Weise kann unsere Docker-Anwendung die Datenbank erreichen. Warum? Daher werden sie im selben Docker-Compose gestartet und wissen auf diese Weise voneinander. Dies ist notwendig, damit wir eine geschlossene Infrastruktur für das Projekt haben. Aber wie startet man das Profil beim Start? Dazu können Sie den Start der Hauptmethode in Intellij IDEA konfigurieren. Dafür gibt es Edit Configurations : Gehen Sie zur Hauptklasse von JavarushTelegramBotApplication, klicken Sie auf den grünen Pfeil neben der Deklaration der Hauptmethode und wählen Sie Modify Run Configuration : „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 10Geben Sie die notwendigen Variablen ein und konfigurieren Sie das Profil. In Intellij IDEA hat sich die Schnittstelle dieses Konfigurationsfensters leicht geändert, daher rate ich jedem, IDEA auf die neueste Version zu aktualisieren, damit wir das gleiche Bild sehen: „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 11Im Feld Umgebungsvariablen müssen wir den Bot-Namen und die Token-Variablen hinzufügen die folgende Vorlage: Variablenname1=Wert1; Variablenname2=Wert2 . Das heißt, Schlüssel=Wert werden durch Semikolons getrennt. In unserem Fall sieht es so aus: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (Sie haben einen anderen Namen und ein anderes Token für den Bot) Wählen Sie als Nächstes das Feld „VM-Optionen hinzufügen“ in der Schaltfläche „Optionen ändern“ aus : Schreiben : -Dspring.profiles.active =test – Dadurch wird SpringBoot angewiesen, das Testprofil zu verwenden, was bedeutet, dass die Eigenschaften aus application-test.properties übernommen werden. Als Ergebnis wird es so aussehen: Jetzt starten wir unsere Testdatenbank: docker-compose -f docker-compose-test.yml up Und genau so, ohne das Präfix -d, damit die Protokolle sofort sichtbar sind das Terminal, falls welche benötigt werden. Und der letzte Schritt besteht darin, einfach die Hauptmethode auszuführen. Wenn Sie alles so machen, wie ich es beschrieben habe, erhalten Sie am Ende: In der zweiten Zeile der Protokolle wird beschrieben, was das Testprofil verdient hat. Wir gehen MySQLWorkbench durch und führen zwei Befehle aus, um zu überprüfen, ob die Migration durchgeführt wurde und alles funktioniert (obwohl dies aus den Startprotokollen der Anwendung ersichtlich ist, lohnt es sich auf jeden Fall, es zu überprüfen):„Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 12„Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 13„Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 14
  1. benutze dev_jrtb_db;
  2. Tische anzeigen;
Ergebnis: „Java-Projekt von A bis Z“: Alles rund um die Datenbank hinzufügen.  Teil 1 - 15Wie erwartet haben wir zwei Tische bekommen. Die erste ist technisch für die Berücksichtigung von Migrationen, die zweite ist unsere Tabelle für Telegram-Benutzer. Alle: Flyway wurde zusammen mit der Datenbank hinzugefügt. Jetzt werden neue Migrationen wie am Schnürchen verlaufen. Das Schwierigste ist die erste Einrichtung und der Start des Prozesses. Als Fortsetzung schließen wir die Arbeit an dieser globalen Aufgabe ab: Hinzufügen von Datenbanken zu docker-compose.yml, Hinzufügen einer Repository-Ebene, Statistiken für den Bot, Schreiben und Aktualisieren von Tests und Dokumentation.

Eine Liste aller Materialien der Serie finden Sie am Anfang dieses Artikels.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION