JavaRush /จาวาบล็อก /Random-TH /เราเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล (ตอนที่ 1) - "โค...
Roman Beekeeper
ระดับ

เราเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล (ตอนที่ 1) - "โครงการ Java จาก A ถึง Z"

เผยแพร่ในกลุ่ม
ทีละขั้นตอนเรากำลังก้าวไปสู่เป้าหมายของเรา "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ตอนที่ 1 - 1วันนี้เราต้องแก้ไขงานหลายอย่าง:
  1. เพิ่มฟลายเวย์. ที่นี่เราจะกำหนดค่าการปรับใช้ฐานข้อมูลสำหรับโครงการ
  2. เพิ่มสคีมาฐานข้อมูล
  3. เพิ่มชั้นพื้นที่เก็บข้อมูล
  4. เพิ่มคำสั่งสำหรับสถิติบอท
  5. เขียนแบบทดสอบเลย
นั่งลงนั่งลงจะอ่านยาว เราได้เรียนรู้วิธีปรับใช้แอปพลิเคชันของเราโดยใช้ docker และ docker-compose แล้ว มันไม่ง่ายเลย และขอแสดงความยินดีกับผู้ที่ทำได้ หากคุณมีคำถามใดๆ เกี่ยวกับการใช้งาน คุณสามารถดูโค้ดในคำขอดึงนี้

เพิ่มเส้นทางบิน

หากต้องการเพิ่ม Flyway คุณต้องมีฐานข้อมูล ซึ่งเราจะเพิ่มเป็นบริการอื่นใน docker-compose ครั้งล่าสุดที่ฉันบอกว่า docker-compose มีส่วนบริการ ซึ่งมีหน้าที่รับผิดชอบในการเพิ่มและจัดการโครงสร้างพื้นฐานบางอย่าง นั่นก็คือ ชุดของแอปพลิเคชัน/ฐานข้อมูล/ผู้ส่งสาร ฯลฯ
ฉันได้พูดคุยไปแล้วว่าFlyway คืออะไร และจะเพิ่มลงในแอปพลิเคชัน SpringBoot ได้อย่างไร ฉันแนะนำให้คุณรีเฟรชหน่วยความจำก่อนอ่านบทความนี้ คุณยังสามารถอ่าน ไฟล์ README.mdของโครงการพร้อมการสาธิตบทความเกี่ยวกับ Flyway + SpringBoot
สิ่งแรกที่เราทำคืออัปเดตสาขาหลักของเราในโปรเจ็กต์ (git pull) และสร้างสาขาใหม่ด้วยชื่องานของเรา - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1) ฉันขอเตือนคุณ: เราเปลี่ยนชื่อสาขาเพื่อให้สามารถเรียงลำดับงานในโครงการตามชื่อเท่านั้น สิ่งนี้จะช่วยให้คุณสามารถย้ายจากขั้นตอนหนึ่งไปอีกขั้นหนึ่งได้อย่างรวดเร็ว ตอนนี้คุณสามารถทำงานอย่างสงบสุขได้แล้ว เราจำเป็นต้องเพิ่มการพึ่งพาสามรายการ:
<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>
การพึ่งพาครั้งแรกมีหน้าที่รับผิดชอบในการเพิ่ม FlyWay ให้กับโครงการ ส่วนที่สองเพิ่มความสามารถในการเชื่อมต่อกับฐานข้อมูล MySQL อย่างที่สามคือ SpringBoot Starter ซึ่งเปิดตัวความมหัศจรรย์ทั้งหมดของการใช้ฐานข้อมูลใน Spring และเรามาเพิ่มลอมบอกด้วยเพื่อไม่ให้เขียน getters และ setters:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
ตอนนี้เราต้องการฐานข้อมูลเพื่อการพัฒนา เราจะสร้างมันขึ้นมาในตอนนี้ ( จนกว่าฉันจะได้แนวคิดที่ดีกว่า ) เป็นไฟล์นักเทียบท่าแยกและไฟล์แยกต่างหากสำหรับ application.properties มีสิ่งดังกล่าวอยู่ระหว่างการพัฒนา (และในระบบนิเวศของ Spring โดยเฉพาะ) เป็นโปรไฟล์ การตั้งค่าต่างๆ จะถูกเปิดใช้งานเพื่อการทำงาน ทั้งนี้ขึ้นอยู่กับโปรไฟล์ ฉันคิดว่าในอนาคตเราจะรวมนักเทียบท่าเขียนเป็นไฟล์เดียวและตรวจสอบให้แน่ใจว่ามีเพียงฐานข้อมูลเดียวเท่านั้นที่เปิดตัวเพื่อการพัฒนาในการตั้งค่าที่เราต้องการ ในตอนนี้เราจะทำสิ่งนี้:
  1. มาสร้างไฟล์ในรูทของโปรเจ็กต์ docker-compose-test.yml ซึ่งจะมีการเปิดตัวเฉพาะฐานข้อมูลที่มีการตั้งค่าของตัวเองเท่านั้น
  2. มาสร้างไฟล์ application-test.properties ด้วยการตั้งค่าที่ตรงกับการตั้งค่าในไฟล์ docker-compose-test.yml
ในการทำงานกับ MySQL ฉันได้อิมเมจอย่างเป็นทางการจากDockerHub : "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 2หลังจากเลื่อนดูอย่างรวดเร็ว ฉันพบตัวแปรที่จำเป็น: MYSQL_DATABASE - ชื่อฐานข้อมูล MYSQL_USER - ชื่อผู้ใช้ฐานข้อมูล MYSQL_PASSWORD - รหัสผ่านผู้ใช้ฐานข้อมูล และวิธีที่ต้องเขียนอย่างถูกต้อง:
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
หลังจากนั้น ฉันสร้าง docker-compose-test.yml ในรูทโปรเจ็กต์:
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
หากต้องการเรียกใช้ไฟล์นี้เพื่อทำงานกับ docker-compose คุณต้องใช้ แฟล็ก -f ใน คำขอ หมายความว่าจะมีการระบุชื่อของไฟล์ที่เปิดใช้งาน แทนที่จะใช้ docker-compose.yml มาตรฐาน ดังนั้นคำขอจะมีลักษณะดังนี้: docker-compose -f docker-compose-test.yml up -d ปรากฎว่าก่อนอื่นเราบอกว่าจะใช้ไฟล์ใด ( -f docker-compose-test.yml ) จากนั้นเรา บอกว่าเราจำเป็นต้องยกระดับบริการและทำสิ่งนี้ในโหมด daemon ( up -d ) - นั่นคือเพื่อให้กระบวนการทำงานนอกเซสชันเทอร์มินัลที่เรียกใช้คำสั่งนี้ เราเปิดตัวและพยายามเชื่อมต่อกับฐานข้อมูลเพื่อให้แน่ใจว่าพร้อมใช้งานและสามารถใช้งานได้ ในการดำเนินการนี้ ให้เปิด MySQL Workbench ที่คุ้นเคย ( เราพูดถึงเรื่องนี้แล้ว ) และสร้างการเชื่อมต่อใหม่: "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 3เราจำเป็นต้องกรอกข้อมูลในฟิลด์ต่อไปนี้:
  • ชื่อการเชื่อมต่อ - ชื่อการเชื่อมต่อ - ทางเลือก DEV_JRTB_DB;
  • ชื่อโฮสต์ - นี่คือที่อยู่ที่ใช้ฐานข้อมูล ในกรณีของเราทุกอย่างจะยังคงเหมือนเดิม: 127.0.0.1หรือ localhost;
  • ชื่อผู้ใช้ - ที่นี่จะเป็นรูทดังที่เราเขียนไว้ใน docker-compose
  • รหัสผ่าน - รวมถึงรูท
หลังจากนี้คุณต้องตรวจสอบว่าการเชื่อมต่อใช้งานได้หรือไม่ เมื่อต้องการทำสิ่งนี้ ให้คลิกทดสอบการเชื่อมต่อ : "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 4ด้วยเหตุนี้เราจึงได้รับ: ไม่สามารถเชื่อมต่อกับ MySQL... เพราะเหตุใด เราไปที่เทอร์มินัลแล้วดูว่าเกิดอะไรขึ้นกับคอนเทนเนอร์นักเทียบท่า มาเขียนในเทอร์มินัลกัน: "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 5เราเห็นว่าเทอร์มินัลถูกสร้างขึ้นเมื่อ 59 นาทีที่แล้ว และการรีสตาร์ทคือ 55 วินาที... ทำไม? ไม่ชัดเจน คุณต้องดูบันทึก ไปที่รูทโปรเจ็กต์ในเทอร์มินัลแล้วรันคำสั่งต่อไปนี้: docker-compose -f docker-compose-test.yml logs
เราได้รับ:

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

ตอนนี้เป็นที่ชัดเจนแล้วว่าฐานข้อมูลไม่เคยเริ่มต้นด้วยการตั้งค่าของเรา ข้อผิดพลาดจะเหมือนกัน ดังนั้นมาแยกข้อผิดพลาดออกจากชีตกันดีกว่า:
2021-02-28 11:03:37+00:00 [ข้อผิดพลาด] [จุดเข้าใช้งาน]: ฐานข้อมูลไม่ได้เตรียมใช้งานและไม่ได้ระบุตัวเลือกรหัสผ่าน dev-jrtb-db | คุณต้องระบุหนึ่งใน MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD และ MYSQL_RANDOM_ROOT_PASSWORD
นั่นคือเขาจำเป็นต้องกำหนดรหัสผ่านสำหรับผู้ใช้รูท - ผู้ใช้หลัก เอาล่ะ ตอนนี้เราจะอัปเดตไฟล์ของเรา:
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
เราลบตัวแปรเหล่านั้นสำหรับผู้ใช้และรหัสผ่าน และเพิ่มเฉพาะรหัสผ่านสำหรับผู้ใช้รูท ซึ่งหมายความว่าผู้ใช้รูทจะมีรหัสผ่านรูทแล้ว อย่างน้อยนั่นคือสิ่งที่เราสมมติ ทีนี้มาเรียกใช้และดูว่าเกิดอะไรขึ้น: docker-compose -f docker-compose-test.yml up -d และดูว่าบันทึกบอกอะไรเราทันที: docker-compose -f docker-compose-test.yml logs
มาดูกัน:

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.

ดูเหมือนจะไม่มีข้อผิดพลาดอีกต่อไป ดังนั้นคุณจึงดูได้ว่าจะมีการเข้าถึงหรือไม่ แต่น่าเสียดาย ที่ไม่สามารถเข้าถึงได้อีก... ไม่มีอะไร เราจะคิดหาทางต่อไป! "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 6หากต้องการยุติ docker-compose และลบคอนเทนเนอร์ทั้งหมด คุณต้องเขียน: docker-compose -f docker-compose-test.yml down ที่นี่เราระบุไฟล์ที่จะลบ จะทำอย่างไร? ลอง Google ดูสิ: บางทีอาจมีคนทำได้ดีกว่านี้ ข้อความค้นหาที่ง่ายที่สุด: “ตัวอย่าง mysql ใน docker-compose” ช่วยให้เราค้นหาลิงก์ไปยังทรัพยากรสื่อ พวกเขาให้ตัวอย่างนี้:
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:
เราปรับให้เข้ากับความต้องการของเราและได้รับ:
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'
เราเปิดตัวตัวเลือกนี้ด้วยคำสั่งที่เรารู้จักอยู่แล้ว: docker-compose -f docker-compose-test.yml up -d เราลองอีกครั้งเพื่อเข้าถึงฐานข้อมูลผ่าน MySQLWorkBench: "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ตอนที่ 1 - 7ในที่สุดการเข้าถึงก็ปรากฏขึ้น แต่ตอนนี้ฉันสงสัยว่าอะไรมีอิทธิพลต่อสิ่งนี้ ฉันทำบาปในส่วนนี้:
expose:
   # Opens port 3306 on the container
   - '3306'
ตรวจสอบได้ง่าย: หากไม่มีสิ่งนี้ ก็ไม่มีอะไรจะทำงาน :D มาตรวจสอบกัน: ลบส่วนนี้ รีสตาร์ท docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up เราพยายามเข้าสู่ฐานข้อมูลผ่าน workbench: ทุกอย่างเรียบร้อยดี . ตัวเลือกเดียวคือเวอร์ชันฐานข้อมูล มันระบุไว้อย่างชัดเจนว่า 5.7 นั่นคือถ้าคุณเปลี่ยนเป็นล่าสุดก็ไม่ควรทำงาน ฉันรีสตาร์ทแล้ว - และมันใช้งานไม่ได้จริงๆ... "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 8เห็นได้ชัดว่าพวกเขามีปัญหาบางอย่างกับอิมเมจนักเทียบท่าในเวอร์ชันล่าสุด ได้ไม่มีปัญหา. สิ่งนี้มักเกิดขึ้นกับซอฟต์แวร์ฟรี เราจะใช้เวอร์ชัน 5.7 มาดูกันว่ามีฐานข้อมูลที่เราต้องการหรือไม่ - dev_jrtb_db เมื่อต้องการทำเช่นนี้ ให้รันคำสั่ง Query ใน MySQL Workbench SHOW DATABASES : "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 9ใช่ มีอยู่ในเอาต์พุต เยี่ยมมาก เราเดินหน้าต่อไปได้ ต่อไป มาเพิ่มการโยกย้ายครั้งแรกของเรา จากงานจากบทความ“การวางแผนโครงการ: วัดสองครั้ง ตัดครั้งเดียว”เราจะสร้างตารางแรกของเรา tg_user การย้ายข้อมูลทั้งหมดจะอยู่ใน โฟลเดอร์ projectDir/src/main/resources/db/migrationและชื่อจะเป็น: V00001__add_tg_user_table.sql เหตุใดจึงมีชื่อดังกล่าวในโฟลเดอร์นั้น - ฉันอธิบายไว้ในบทความเกี่ยวกับ Spring + flyway นี่คือลักษณะของการโยกย้ายครั้งแรกของเรา: 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
);
นั่นคือที่นี่เราเพียงสร้างตารางของผู้ใช้ที่มีเพียง ID แชท (องค์ประกอบเฉพาะที่สามารถใช้เป็น ID ในตารางได้) และสถานะ - ใช้งานอยู่หรือไม่ได้ใช้งาน ดังนั้น หากบอทถูกหยุด ข้อมูลการสมัครสมาชิกจะยังคงอยู่และสามารถใช้ได้หากต้องการใช้บอทอีกครั้ง ไม่จำเป็นต้องมีข้อมูลอื่นเกี่ยวกับผู้ใช้ในขณะนี้ ตอนนี้คำถามหลัก: จะตรวจสอบสิ่งนี้ได้อย่างไร? เราจำเป็นต้องเปิดแอปพลิเคชันของเรา จนถึงตอนนี้ ไฟล์ docker-compose.yml หลักไม่มีการเชื่อมต่อกับฐานข้อมูล และเรายังจำเป็นต้องเรียนรู้วิธีแก้ไขข้อบกพร่องของแอปพลิเคชันร่วมกับฐานข้อมูลด้วย ดังนั้นเรามาเปิดแอปพลิเคชันด้วย Intellij IDEA กันดีกว่า เพื่อทดสอบสิ่งนี้ เราจะต้องเรียกใช้วิธีการหลักของเราใน JavarushTelegramBotApplication เพื่อแยกงานการปรับใช้และการทดสอบ เราจะใช้ไฟล์อื่นที่มีคุณสมบัติ- application-test.properties ด้วยเทมเพลตนี้ เราจะแจ้งให้ Spring ทราบว่าไฟล์ นี้จะใช้สำหรับ โปรไฟล์ ทดสอบ เมื่อเราไม่ระบุโปรไฟล์ ระบบจะใช้โปรไฟล์เริ่มต้น (ตรวจสอบสิ่งนี้ในบันทึกของคุณเมื่อเรียกใช้ SpringBoot: โดยจะเขียนเกี่ยวกับสิ่งนี้ในบรรทัดแรก) นี่คือสิ่งที่จะมีลักษณะดังนี้:
# 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
และ main application.propertiesจะดูแตกต่างออกไปเล็กน้อย:
# 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
ความแตกต่างที่สำคัญอยู่ในฟิลด์spring.datasource.url:ในโปรไฟล์ทดสอบ เรามี URL บนlocalhost นั่นคือแอปพลิเคชันควรทำงานนอก Docker ซึ่งก็เป็นจริง เพราะเมื่อทำการดีบั๊ก เราจะรันโปรเจ็กต์ของเราใน Intellij IDEA และคาดหวังว่าเราจะสามารถเข้าถึงฐานข้อมูลจากเครื่องในเครื่องได้ แต่ URL ของ application.properties มี URL อื่นอยู่แล้ว - jrtb- db นี่จะเป็นชื่อของฐานข้อมูลของเราใน docker-compose และวิธีนี้จะทำให้แอปพลิเคชัน docker ของเราสามารถเข้าถึงฐานข้อมูลได้ ทำไม ดังนั้นพวกเขาจะเปิดตัวภายใน docker-compose เดียวกันและจะรู้จักกันในลักษณะนี้ นี่เป็นสิ่งจำเป็นเพื่อให้เรามีโครงสร้างพื้นฐานแบบปิดหนึ่งรายการสำหรับโครงการ แต่จะเปิดตัวโปรไฟล์เมื่อเริ่มต้นได้อย่างไร? เมื่อต้องการทำเช่นนี้ คุณสามารถกำหนดค่าการเปิดใช้งานวิธีการหลักใน Intellij IDEA สำหรับสิ่งนี้ มีแก้ไขการกำหนดค่า : ไปที่คลาสหลักของ JavarushTelegramBotApplication คลิกที่ลูกศรสีเขียวตรงข้าม การประกาศเมธอด หลักและเลือกแก้ไขการกำหนดค่าการรัน : "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 10ป้อนตัวแปรที่จำเป็นและกำหนดค่าโปรไฟล์ ใน Intellij IDEA อินเทอร์เฟซของหน้าต่างการกำหนดค่านี้มีการเปลี่ยนแปลงเล็กน้อย ดังนั้นฉันแนะนำให้ทุกคนอัปเดต IDEA เป็นเวอร์ชันล่าสุด เพื่อให้เราเห็นภาพเดียวกัน: "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 11ใน ฟิลด์ ตัวแปรสภาพแวดล้อมเราจำเป็นต้องเพิ่มชื่อบอทและตัวแปรโทเค็นโดยใช้ เทมเพลตต่อไปนี้: Variable_name1=value1; Variable_name2= value2 นั่นคือ key=value คั่นด้วยเครื่องหมายอัฒภาค ในกรณีของเราจะเป็นดังนี้: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (คุณจะมีชื่อและโทเค็นที่แตกต่างกันสำหรับบอท) ถัดไป เลือกฟิลด์เพิ่มตัวเลือก VM ในปุ่ม แก้ไขตัวเลือก : เขียน : -Dspring.profiles.active =test - เป็นการบอกให้ SpringBoot ใช้โปรไฟล์ทดสอบ ซึ่งหมายความว่าคุณสมบัตินั้นจะถูกนำมาจาก application-test.properties ผลลัพธ์จะมีลักษณะดังนี้: ตอนนี้เราเปิดตัวฐานข้อมูลทดสอบของเรา: docker-compose -f docker-compose-test.yml up และด้วยวิธีนี้ โดยไม่มีคำนำหน้า -d เพื่อให้สามารถมองเห็นบันทึกได้ทันที เทอร์มินัล หากมีความจำเป็น และขั้นตอนสุดท้ายคือการรันวิธีหลัก หากคุณทำทุกอย่างในลักษณะเดียวกับที่ฉันอธิบายไว้ คุณจะพบกับ: บรรทัดที่สองของบันทึกจะเป็นคำอธิบายว่าโปรไฟล์ทดสอบได้รับอะไรบ้าง เราใช้ MySQLWorkbench และรันคำสั่งสองคำสั่งเพื่อตรวจสอบว่าการโยกย้ายได้เริ่มต้นแล้วและทุกอย่างทำงานได้ (แม้ว่าจะมองเห็นได้จากบันทึกการเปิดตัวแอปพลิเคชัน แต่ก็คุ้มค่าที่จะตรวจสอบอย่างแน่นอน):"โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 12"โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 13"โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ตอนที่ 1 - 14
  1. ใช้ dev_jrtb_db;
  2. แสดงตาราง;
ผลลัพธ์: "โครงการ Java จาก A ถึง Z": การเพิ่มทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล  ส่วนที่ 1 - 15ตามที่เราคาดไว้ เราได้สองตาราง อย่างแรกคือเทคนิคสำหรับการบัญชีสำหรับการย้ายข้อมูล ส่วนที่สองคือตารางของเราสำหรับผู้ใช้ Telegram ทั้งหมด: เพิ่ม Flyway พร้อมกับฐานข้อมูลแล้ว ตอนนี้การอพยพครั้งใหม่ดำเนินไปเหมือนเครื่องจักร สิ่งที่ยากที่สุดคือการตั้งค่าและเปิดใช้กระบวนการครั้งแรก เรากำลังดำเนินการงานระดับโลกนี้ให้เสร็จสิ้น: การเพิ่มฐานข้อมูลลงใน docker-compose.yml, การเพิ่มเลเยอร์ Repository, สถิติสำหรับบอท, การเขียนและการอัปเดตการทดสอบและเอกสารประกอบ

รายการเนื้อหาทั้งหมดในซีรีส์นี้อยู่ที่ตอนต้นของบทความนี้

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION