JavaRush /Blog Java /Random-VI /Chúng tôi thêm mọi thứ liên quan đến cơ sở dữ liệu. (Phần...
Roman Beekeeper
Mức độ

Chúng tôi thêm mọi thứ liên quan đến cơ sở dữ liệu. (Phần 1) - "Dự án Java từ A đến Z"

Xuất bản trong nhóm
Chúng tôi đang từng bước tiến tới mục tiêu của mình. "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 1Hôm nay chúng ta cần giải quyết nhiều nhiệm vụ:
  1. Thêm đường bay. Ở đây chúng ta sẽ cấu hình việc triển khai cơ sở dữ liệu cho dự án.
  2. Thêm một lược đồ cơ sở dữ liệu.
  3. Thêm một lớp kho lưu trữ.
  4. Thêm lệnh để thống kê bot.
  5. Rốt cuộc thì hãy viết bài kiểm tra.
Vì vậy hãy ngồi lại, ngồi lại, sẽ có một bài đọc dài. Chúng ta đã học cách triển khai ứng dụng của mình bằng docker và docker-compose. Điều đó không hề dễ dàng và xin chúc mừng những người đã làm được điều đó. Nếu bạn có bất kỳ câu hỏi nào về việc triển khai, bạn có thể xem mã trong yêu cầu kéo này .

Thêm đường bay

Để thêm Flyway, bạn cần có cơ sở dữ liệu mà chúng tôi sẽ thêm dưới dạng một dịch vụ khác trong docker-compose. Lần trước tôi đã nói rằng docker-compose có một phần dịch vụ, chịu trách nhiệm chính xác về việc thêm và quản lý một cơ sở hạ tầng nhất định - nghĩa là một tập hợp các ứng dụng/cơ sở dữ liệu/trình nhắn tin, v.v.
Tôi đã nói về Flyway là gì và cách thêm nó vào ứng dụng SpringBoot . Tôi khuyên bạn nên làm mới trí nhớ của mình trước khi đọc bài viết này. Bạn cũng có thể đọc file README.md của dự án với phần minh họa bài viết về Flyway + SpringBoot.
Điều đầu tiên chúng tôi làm là cập nhật nhánh chính của mình trong dự án (git pull) và tạo một nhánh mới với tên nhiệm vụ của chúng tôi - STEP_5_JRTB-1 (gitcheck -b STEP_5_JRTB-1). Hãy để tôi nhắc bạn: chúng tôi đã đổi tên các nhánh để có thể sắp xếp chuỗi nhiệm vụ trong dự án chỉ theo tên. Điều này sẽ cho phép bạn nhanh chóng chuyển từ bước này sang bước khác. Bây giờ bạn có thể làm việc trong hòa bình. Chúng ta cần thêm ba phụ thuộc:
<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>
Phần phụ thuộc đầu tiên chịu trách nhiệm thêm FlyWay vào dự án, phần phụ thuộc thứ hai bổ sung khả năng kết nối với cơ sở dữ liệu MySQL. Thứ ba là SpringBoot khởi động, khởi chạy tất cả những điều kỳ diệu của việc sử dụng cơ sở dữ liệu trong Spring. Và hãy thêm lombok để không viết getters và setters:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Bây giờ chúng ta cần một cơ sở dữ liệu để phát triển. Chúng tôi sẽ tạo nó ngay bây giờ ( cho đến khi tôi nghĩ ra ý tưởng hay hơn ) dưới dạng một tệp docker-compose riêng và một tệp riêng cho application.properties. Có một thứ như vậy trong quá trình phát triển (và đặc biệt là trong hệ sinh thái Spring) dưới dạng hồ sơ. Tùy thuộc vào cấu hình, các cài đặt khác nhau sẽ được đưa ra để hoạt động. Tôi nghĩ trong tương lai chúng tôi sẽ kết hợp docker-compose thành một tệp và đảm bảo rằng chỉ có một cơ sở dữ liệu được khởi chạy để phát triển trên các cài đặt mà chúng tôi cần. Bây giờ chúng ta sẽ làm điều này:
  1. Hãy tạo một tệp trong thư mục gốc của dự án docker-compose-test.yml, trong đó chỉ cơ sở dữ liệu có cài đặt riêng sẽ được khởi chạy.
  2. Hãy tạo một tệp application-test.properties với các cài đặt khớp với cài đặt trong tệp docker-compose-test.yml.
Để làm việc với MySQL, tôi lấy hình ảnh chính thức từ DockerHub : "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 2Sau khi lướt qua nhanh, tôi tìm thấy các biến cần thiết: MYSQL_DATABASE - tên cơ sở dữ liệu MYSQL_USER - tên người dùng cơ sở dữ liệu MYSQL_PASSWORD - mật khẩu người dùng cơ sở dữ liệu Và cách viết chúng chính xác:
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
Sau đó, tôi tạo docker-compose-test.yml trong thư mục gốc của dự án:
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
Để chạy tệp cụ thể này để hoạt động với docker-compose, bạn cần sử dụng cờ -f trong yêu cầu . Điều đó có nghĩa là tên của tệp được khởi chạy sẽ được cung cấp, thay vì docker-compose.yml tiêu chuẩn được lấy. Do đó, yêu cầu sẽ giống như thế này: docker-compose -f docker-compose-test.yml up -d Hóa ra trước tiên chúng tôi nói nên lấy tệp nào ( -f docker-compose-test.yml ), và sau đó chúng tôi giả sử rằng chúng ta cần nâng cấp các dịch vụ và thực hiện việc này ở chế độ daemon ( up -d ) - nghĩa là để quá trình chạy bên ngoài phiên cuối mà lệnh này được khởi chạy. Chúng tôi khởi chạy và cố gắng kết nối với cơ sở dữ liệu để đảm bảo rằng nó đã hoạt động và có thể sử dụng được. Để thực hiện việc này, hãy mở MySQL Workbench quen thuộc ( chúng tôi đã nói về nó ở đây ) và tạo một kết nối mới: "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 3Chúng ta cần điền vào các trường sau:
  • Tên kết nối - tên kết nối - tùy chọn, DEV_JRTB_DB;
  • Tên máy chủ - đây là địa chỉ nơi cơ sở dữ liệu được triển khai. Trong trường hợp của chúng tôi, mọi thứ sẽ vẫn như cũ: 127.0.0.1 hoặc localhost;
  • tên người dùng - ở đây sẽ là root, như chúng tôi đã viết bằng docker-compose;
  • mật khẩu - cũng là root.
Sau này, bạn cần kiểm tra xem kết nối có hoạt động không. Để thực hiện việc này, hãy nhấp vào Kiểm tra kết nối : "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 4Kết quả là chúng tôi nhận được: Không thể kết nối với MySQL... Tại sao? Chúng ta đến terminal và xem điều gì đã xảy ra với docker container. Hãy viết vào thiết bị đầu cuối: "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 5Chúng ta thấy rằng thiết bị đầu cuối đã được tạo cách đây 59 phút và thời gian khởi động lại là 55 giây... tại sao? Nó không rõ ràng, bạn cần nhìn vào nhật ký. Đi tới thư mục gốc của dự án trong terminal và chạy lệnh sau: docker-compose -f docker-compose-test.yml logs
Chúng tôi nhận được:

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

Bây giờ rõ ràng là cơ sở dữ liệu chưa bao giờ bắt đầu với cài đặt của chúng tôi. Lỗi là như nhau nên hãy tách nó ra khỏi trang tính:
28-02-2021 11:03:37+00:00 [ERROR] [Entrypoint]: Cơ sở dữ liệu chưa được khởi tạo và tùy chọn mật khẩu không được chỉ định dev-jrtb-db | Bạn cần chỉ định một trong MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD và MYSQL_RANDOM_ROOT_PASSWORD
Tức là anh ta cần xác định mật khẩu cho người dùng root - người dùng chính. Được rồi, bây giờ chúng tôi sẽ cập nhật tệp của mình:
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
Chúng tôi đã xóa các biến đó cho người dùng và mật khẩu và chỉ thêm mật khẩu cho người dùng root. Điều này có nghĩa là người dùng root bây giờ sẽ có mật khẩu root. Ít nhất đó là những gì chúng tôi giả định. Bây giờ hãy chạy nó và xem điều gì sẽ xảy ra: docker-compose -f docker-compose-test.yml up -d Và ngay lập tức xem nhật ký cho chúng ta biết điều gì: docker-compose -f docker-compose-test.yml logs
Hãy xem:

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.

Hình như không còn lỗi gì nữa nên bạn xem có truy cập được không nhé. Nhưng thật không may, không có quyền truy cập nữa... Không có gì: chúng tôi sẽ tìm hiểu thêm! "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 6Để chấm dứt docker-compose và xóa tất cả các vùng chứa, bạn cần viết: docker-compose -f docker-compose-test.yml down Ở đây chúng tôi đã chỉ định tệp sẽ bị xóa. Phải làm gì? Hãy google nó: có thể ai đó đã làm nó tốt hơn. Truy vấn đơn giản nhất: “ví dụ về mysql trong docker-compose” giúp chúng tôi tìm liên kết đến một tài nguyên trung bình. Họ đưa ra ví dụ này:
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:
Chúng tôi điều chỉnh nó theo nhu cầu của mình và nhận được:
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'
Chúng tôi khởi chạy tùy chọn này bằng lệnh đã biết: docker-compose -f docker-compose-test.yml up -d Chúng tôi thử truy cập lại cơ sở dữ liệu thông qua MySQLWorkBench: "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 7Cuối cùng, quyền truy cập đã xuất hiện. Nhưng bây giờ tôi tự hỏi điều gì đã ảnh hưởng đến điều này. Tôi đang phạm tội ở phần này:
expose:
   # Opens port 3306 on the container
   - '3306'
Thật dễ dàng để kiểm tra: không có cái này thì không có gì hoạt động được :D. Hãy kiểm tra: xóa phần này, khởi động lại docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up Chúng tôi cố gắng vào cơ sở dữ liệu thông qua bàn làm việc: mọi thứ đều ổn . Sau đó, lựa chọn duy nhất là phiên bản cơ sở dữ liệu. Nó ghi rõ là 5.7, tức là nếu bạn thay đổi lên bản mới nhất thì nó sẽ không hoạt động. Tôi đã khởi động lại nó - và nó thực sự không hoạt động... "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 8Rõ ràng là họ gặp một số vấn đề với hình ảnh docker trên phiên bản mới nhất. Ổn không có vấn đề. Điều này thường xảy ra với phần mềm miễn phí. Chúng tôi sẽ sử dụng phiên bản 5.7. Hãy xem liệu có cơ sở dữ liệu mà chúng ta cần không - dev_jrtb_db. Để thực hiện việc này, hãy chạy lệnh Query trong MySQL Workbench SHOW DATABASES : "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 9Có, nó có trong đầu ra. Tuyệt vời, chúng ta có thể tiếp tục. Tiếp theo, hãy thêm lần di chuyển đầu tiên của chúng ta. Dựa trên các nhiệm vụ trong bài viết “Lập kế hoạch dự án: đo hai lần, cắt một lần”, chúng ta sẽ tạo bảng tg_user đầu tiên. Tất cả các lần di chuyển sẽ được đặt trong thư mục projectDir/src/main/resources/db/migration và tên sẽ là: V00001__add_tg_user_table.sql . Tại sao lại có cái tên như vậy trong thư mục đó - tôi đã mô tả nó trong bài viết về Spring + flyway. Quá trình di chuyển đầu tiên của chúng ta sẽ trông như thế này: 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
);
Nghĩa là, ở đây chúng ta chỉ cần tạo một bảng gồm một người dùng chỉ có ID trò chuyện (một phần tử duy nhất có thể được sử dụng để hoạt động như một ID trong bảng) và trạng thái của nó - hoạt động hoặc không hoạt động. Vì vậy, nếu dừng bot, thông tin đăng ký sẽ vẫn còn và có thể được sử dụng nếu họ muốn sử dụng lại bot. Hiện tại không cần thông tin nào khác về người dùng. Bây giờ câu hỏi chính: làm thế nào để kiểm tra điều này? Chúng ta cần khởi chạy ứng dụng của mình. Cho đến nay, tệp docker-compose.yml chính không có kết nối với cơ sở dữ liệu và chúng ta cũng cần tìm hiểu cách gỡ lỗi ứng dụng cùng với cơ sở dữ liệu. Vì vậy, hãy khởi chạy ứng dụng với Intellij IDEA. Để kiểm tra điều này, chúng ta sẽ cần chạy phương thức chính của mình trong JavarushTelegramBotApplication. Để tách biệt công việc triển khai và thử nghiệm, chúng tôi sẽ sử dụng một tệp khác có thuộc tính - application-test.properties . Với mẫu này, chúng tôi cho Spring biết rằng tệp này sẽ được sử dụng cho hồ sơ thử nghiệm . Khi chúng tôi không chỉ định một cấu hình, cấu hình mặc định sẽ được sử dụng (hãy kiểm tra điều này trong nhật ký của bạn khi chạy SpringBoot: nó sẽ được viết về điều này trong những dòng đầu tiên). Nó sẽ trông như thế này:
# 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
Và ứng dụng chính.properties sẽ trông hơi khác một chút:
# 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
Sự khác biệt đáng kể nằm ở trường spring.datasource.url: trong hồ sơ thử nghiệm, chúng tôi có URL trên localhost . Nghĩa là, ứng dụng dự kiến ​​​​sẽ chạy bên ngoài Docker, điều này đúng vì khi gỡ lỗi, chúng tôi sẽ chạy dự án của mình trong Intellij IDEA và mong đợi rằng chúng tôi sẽ có quyền truy cập vào cơ sở dữ liệu từ máy cục bộ. Nhưng URL application.properties đã chứa một URL khác - jrtb-db . Đây sẽ là tên cơ sở dữ liệu của chúng tôi trong docker-compose và bằng cách này, ứng dụng docker của chúng tôi sẽ có thể truy cập cơ sở dữ liệu. Tại sao? Do đó, chúng sẽ khởi chạy trong cùng một docker-compose và sẽ biết về nhau theo cách này. Điều này là cần thiết để chúng tôi có một cơ sở hạ tầng khép kín cho dự án. Nhưng làm thế nào để khởi chạy hồ sơ khi khởi động? Để thực hiện việc này, bạn có thể định cấu hình khởi chạy phương thức chính trong Intellij IDEA. Đối với điều này, có Chỉnh sửa cấu hình : đi đến lớp chính của JavarushTelegramBotApplication, nhấp vào mũi tên màu xanh lá cây đối diện với khai báo phương thức chính và chọn Sửa đổi cấu hình chạy : "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 10Nhập các biến cần thiết và định cấu hình cấu hình. Trong Intellij IDEA, giao diện của cửa sổ cấu hình này đã thay đổi một chút, vì vậy tôi khuyên mọi người nên cập nhật IDEA lên phiên bản mới nhất để chúng ta thấy cùng một bức tranh: "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 11Trong trường Biến môi trường , chúng ta cần thêm tên bot và biến mã thông báo bằng cách sử dụng mẫu sau: biến_name1=value1; biến_name2=value2 . Nghĩa là, khóa=giá trị được phân tách bằng dấu chấm phẩy. Trong trường hợp của chúng tôi, nó sẽ như thế này: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (bạn sẽ có tên và mã thông báo khác cho bot) Tiếp theo, chọn trường Thêm tùy chọn VM trong nút Sửa đổi tùy chọn : Viết : -Dspring.profiles.active =test - điều này sẽ yêu cầu SpringBoot sử dụng hồ sơ thử nghiệm, nghĩa là các thuộc tính sẽ được lấy từ application-test.properties. Kết quả là nó sẽ trông như thế này: Bây giờ chúng tôi khởi chạy cơ sở dữ liệu thử nghiệm của mình: docker-compose -f docker-compose-test.yml up Và chính xác theo cách này, không có tiền tố -d, để có thể nhìn thấy ngay nhật ký trong thiết bị đầu cuối, nếu có là cần thiết. Và bước cuối cùng chỉ đơn giản là chạy phương thức chính. Nếu bạn làm mọi thứ theo cách tương tự như tôi đã mô tả, bạn sẽ nhận được: Dòng thứ hai của nhật ký sẽ là mô tả về những gì mà hồ sơ thử nghiệm đã đạt được. Chúng tôi đi qua MySQLWorkbench và chạy hai lệnh để kiểm tra xem quá trình di chuyển đã được triển khai chưa và mọi thứ có hoạt động hay không (mặc dù điều này hiển thị từ nhật ký khởi chạy ứng dụng nhưng nó chắc chắn đáng để kiểm tra):"Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 12"Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 13"Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 14
  1. sử dụng dev_jrtb_db;
  2. hiển thị bảng;
Kết quả: "Dự án Java từ A đến Z": Thêm mọi thứ liên quan đến cơ sở dữ liệu.  Phần 1 - 15Như chúng tôi mong đợi, chúng tôi có hai bảng. Đầu tiên là kỹ thuật tính toán việc di chuyển, thứ hai là bảng của chúng tôi dành cho người dùng Telegram. Tất cả: Đường bay cùng với cơ sở dữ liệu đã được thêm vào. Bây giờ những cuộc di chuyển mới sẽ diễn ra như kim đồng hồ. Điều khó khăn nhất là thiết lập và khởi chạy quy trình đầu tiên. Để tiếp tục , chúng tôi đang hoàn thành công việc cho nhiệm vụ toàn cầu này: thêm cơ sở dữ liệu vào docker-compose.yml, thêm lớp Kho lưu trữ, số liệu thống kê cho bot, viết và cập nhật các bài kiểm tra và tài liệu.

Danh sách tất cả các tài liệu trong loạt bài này nằm ở đầu bài viết này.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION