สปริงบูตเริ่มต้นการเชื่อมต่อ H2 jdbc (และคอนโซล H2)


108

ฉันแค่พยายามดูเนื้อหาฐานข้อมูล H2 สำหรับฐานข้อมูล H2 แบบฝังซึ่ง spring-boot สร้างขึ้นเมื่อฉันไม่ได้ระบุอะไรใน application.properties และเริ่มต้นด้วย mvn spring: run ฉันสามารถเห็น hibernate JPA สร้างตาราง แต่ถ้าฉันพยายามเข้าถึงคอนโซล h2 ที่ URL ด้านล่างฐานข้อมูลไม่มีตาราง

http://localhost:8080/console/

ฉันเห็นคำแนะนำเช่นนี้: ดูเนื้อหาของฐานข้อมูล H2 แบบฝังที่เริ่มต้นโดย Spring

แต่ฉันไม่รู้ว่าจะใส่ XML ที่แนะนำในสปริงบูตได้ที่ไหนและแม้ว่าฉันจะทำฉันก็ไม่ต้องการให้ h2console พร้อมใช้งานอีกต่อไปเมื่อมีการกำหนดค่าฐานข้อมูลภายนอกดังนั้นจึงมีแนวโน้มที่ฉันจะต้องจัดการสิ่งนี้ ด้วยรหัสเงื่อนไขบางประเภท (หรืออาจจะอนุญาตให้สปริงจัดการโดยอัตโนมัติในกรณีที่ดีที่สุดที่ฉันรวม H2 เมื่อเปิดใช้งานโปรไฟล์ maven เท่านั้น)

ใครมีโค้ดตัวอย่างที่แสดงวิธีทำให้คอนโซล H2 ทำงานในการบูต (และวิธีค้นหาว่าสตริงการเชื่อมต่อ jdbc ที่สปริงใช้คืออะไร)


ฉันสามารถตอบคำถามของตัวเองได้บางส่วนโดยเพิ่มสิ่งนี้ใน application.properties: spring.datasource.url = jdbc: h2: mem: AZ; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE spring.datasource.driverClassName = org.h2 .datasource.username = sa spring.datasource.password = แต่สิ่งที่ฉันอยากรู้ก็คือวิธีจัดการการกำหนดค่าโดยใช้โปรแกรม (หรืออย่างน้อยก็วิธีค้นหาค่าเริ่มต้นของสปริง)
Aaron Zeckoski


1
geoand - นั่นคือสิ่งเดียวกับที่ฉันเชื่อมโยงในคำถามจริงดังนั้นฉันกลัวว่าจะไม่เป็นประโยชน์
Aaron Zeckoski

2
Dave - ด้วยการเพิ่มการกำหนดค่านั้นฉันสามารถเข้าถึงคอนโซล H2 และดูตารางได้ แต่ไม่ได้ช่วยให้ฉันเข้าใจว่านั่นเป็นวิธีที่ถูกต้องหรือไม่ (ฉันต้องการเข้าถึงการตั้งค่าเพียงครั้งเดียวในฤดูใบไม้ผลิเมื่อฉันไม่มี การตั้งค่า) หรือวิธีรับสปริงการเชื่อมต่อ JDBC โดยใช้
Aaron Zeckoski

1
ใช้ JDBC URL: jdbc: h2: mem: testdb
Chinmoy

คำตอบ:


112

นี่คือวิธีที่ฉันทำให้คอนโซล H2 ทำงานในสปริงบูตกับ H2 ฉันไม่แน่ใจว่าถูกต้องหรือไม่ แต่เนื่องจากไม่มีใครเสนอวิธีแก้ปัญหาฉันจึงขอแนะนำว่านี่เป็นวิธีที่ดีที่สุดที่จะทำ

ในกรณีของฉันฉันเลือกชื่อเฉพาะสำหรับฐานข้อมูลเพื่อที่ฉันจะได้มีอะไรป้อนเมื่อเริ่มคอนโซล H2 (ในกรณีนี้คือ "AZ") ฉันคิดว่าสิ่งเหล่านี้จำเป็นต้องมีแม้ว่าจะดูเหมือนว่าการออกจาก spring.jpa.database-platform จะไม่ส่งผลเสียอะไร

ใน application.properties:

spring.datasource.url=jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

ใน Application.java (หรือการกำหนดค่าบางอย่าง):

@Bean
public ServletRegistrationBean h2servletRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new WebServlet());
    registration.addUrlMappings("/console/*");
    return registration;
}

จากนั้นคุณสามารถเข้าถึงคอนโซล H2 ได้ที่ {server} / console / ป้อนสิ่งนี้เป็น JDBC URL: jdbc: h2: mem: AZ


1
ใช้new WebServlet()ให้ฉันมีปัญหา คุณกำลังนำเข้าคลาสใด มันดึง javax.servlet.annotation.WebServlet สำหรับฉันเป็นตัวเลือกเดียวและเป็นเพียงอินเทอร์เฟซ
Splaktar

5
โอ้ฉันเข้าใจแล้ว org.h2.server.web WebServlet เป็นสิ่งที่จำเป็น โครงการของฉันไม่ได้ซิงค์กับ Gradle เพื่อดึงไลบรารี h2 ใหม่
Splaktar

21
ไม่จำเป็นต้องใช้ชิ้นส่วน application.properties คุณสามารถใช้ส่วน Application.java ที่คุณใส่จากนั้นเชื่อมต่อjdbc:h2:mem:testdbด้วยชื่อผู้ใช้และรหัสผ่านว่างเปล่า localhost: 8082 ใช้งานได้กับการตั้งค่านี้
Splaktar

2
@Splaktar ขอบคุณ! ฉันกำลังพยายามหาวิธีเชื่อมต่อและส่วนที่ขาดหายไปของปริศนาคือการใช้ "testdb" สำหรับชื่อฐานข้อมูล
เนิร์ด

1
@Splaktar - คุณควรแสดงความคิดเห็นเป็นคำตอบ เหมือนที่คุณบอกว่าซอร์สโค้ดสำหรับEmbeddedDatabaseConnectionแสดง URI การเชื่อมต่อฐานข้อมูลแบบฝังตัวเริ่มต้นทั้งหมด
karthik m

55

ในช่วง Spring Boot 1.3.0.M3คอนโซล H2 สามารถกำหนดค่าอัตโนมัติได้

ข้อกำหนดเบื้องต้นคือ:

  • คุณกำลังพัฒนาเว็บแอป
  • เปิดใช้งาน Spring Boot Dev Tools แล้ว
  • H2 อยู่บน classpath

แม้ว่าคุณจะไม่ได้ใช้ Spring Boot Dev Tools แต่คุณยังสามารถกำหนดค่าคอนโซลอัตโนมัติได้โดยตั้งค่าspring.h2.console.enabledเป็นtrue

ตรวจสอบส่วนนี้ของเอกสารสำหรับรายละเอียดทั้งหมด

โปรดทราบว่าเมื่อกำหนดค่าด้วยวิธีนี้คอนโซลจะสามารถเข้าถึงได้ที่: http: // localhost: 8080 / h2-console /


หรือตามที่อธิบายไว้ในเอกสารคุณเปิดใช้งานด้วย spring.h2.console.enabled = true ด้วยข้อกำหนดเบื้องต้นจะเปิดใช้งานโดยอัตโนมัติ
keiki

อะไรที่คุณกำลังพัฒนา app เว็บว่าหมายถึง?
garci560

ในบริบทของ Spring Boot หมายความว่าคุณได้เพิ่มspring-boot-starter-webการพึ่งพาแล้ว
geoand

1
ฉันคิดว่าเมื่อคุณเปิดlocalhost: 8080 / h2-consoleคุณต้องเขียน jdbc: h2: mem: testdb ใน jdbc url เพื่อดูตารางของคุณ และใน url localhost: 8080 / h2-consoleหลังจาก localhost คุณต้องระบุพอร์ตของแอปพลิเคชัน
anujprashar

3
@anujprashar ฉันค่อนข้างแน่ใจว่าjdbc:h2:mem:testdbเป็น URL การเชื่อมต่อไม่ใช่สำหรับ URL ที่คอนโซลสามารถเข้าถึงได้
ภูมิศาสตร์และ

44

ฉันพบบทช่วยสอนที่ดีเกี่ยวกับหัวข้อนี้:

https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/

โดยทั่วไป JDBC URL ที่ถูกต้องสำหรับฉันคือ: jdbc:h2:mem:testdb


1
คำถามโง่ แต่ดูเหมือนว่าจะเป็น JDBC URL เริ่มต้นเนื่องจากการตั้งค่า spring.datasource.name เริ่มต้นเป็น testdb ทำไมถ้าเป็นเช่นนั้นถ้าฉันเปลี่ยนชื่อ db เป็น foodb คือ jdbc ยังเหมือนเดิมและไม่ใช่ jdbc: h2: mem: foodb
Dan Vega

2
jdbc url jdbc: h2: mem: testdb ถูกต้อง ในที่สุดมันก็ช่วยให้ฉันเชื่อมต่อกับฐานข้อมูลเริ่มต้นที่สร้างโดย spring data jpa
Kamal Joshi

คุณสามารถตั้งชื่อ db เป็นอะไรก็ได้เช่น spring.datasource.url = jdbc: h2: mem: test; ใน application.properties
Aleksei Maide

23

จากhttp://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

H2 เว็บคอนโซล (H2ConsoleProperties):

spring.h2.console.enabled=true //Enable the console.
spring.h2.console.path=/h2-console //Path at which the console will be available.

การเพิ่มสองบรรทัดข้างต้นในไฟล์ application.properties ของฉันก็เพียงพอที่จะเข้าถึงเว็บคอนโซลฐานข้อมูล H2 โดยใช้ชื่อผู้ใช้เริ่มต้น (sa) และรหัสผ่าน (ว่างเปล่าเนื่องจากไม่ต้องป้อนรหัสผ่านเมื่อ UI แจ้งให้คุณทราบ)


1
ไม่ควรspring.h2.console.enabled=true? False จะปิดการใช้งาน และspring.h2.console.path=/h2-consoleซ้ำซ้อนเนื่องจาก/h2-consoleเป็นเส้นทางเริ่มต้นจาก Spring Boot ตามเอกสารประกอบ "โดยค่าเริ่มต้นคอนโซลจะพร้อมใช้งานที่ / h2-console คุณสามารถปรับแต่งพา ธ ของคอนโซลโดยใช้คุณสมบัติ spring.h2.console.path" ดูรายละเอียดเพิ่มเติมที่นี่docs.spring.io/spring-boot/docs/current/reference/html/…
georger

ฉันรวมคุณสมบัติหลังเพื่อแสดง OP ที่เขาสามารถเข้าถึงคอนโซลได้ เห็นได้ชัดว่า spring.h2.console.enabled.enabled = false จะปิดการใช้งานคอนโซลประเด็นก็คือสิ่งนี้สามารถกำหนดค่าเป็นคุณสมบัติได้ ฉันจะตั้งค่าคุณสมบัตินั้นเป็นจริงเพื่อความชัดเจน
mancini0

20

คำตอบที่คล้ายกันพร้อมคำแนะนำทีละขั้นตอน

  1. เพิ่มการพึ่งพาเครื่องมือสำหรับนักพัฒนาให้กับคุณpom.xmlหรือbuild.gradle

Maven

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

Gradle

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}
  1. เข้าถึงฐานข้อมูลจาก http://localhost:8080/h2-console/
  2. ระบุjdbc:h2:mem:testdbเป็น JDBC URL
  3. คุณควรเห็นเอนทิตีที่คุณระบุในโครงการของคุณเป็นตาราง

2
การเพิ่มสิ่งนี้ในส่วนการพึ่งพาใช้งานได้สำหรับฉัน 'รันไทม์ ("com.h2database: h2")'
Raja Nagendra Kumar

17

ฉันมีคุณสมบัติด้านล่างใน /resources/application.properties หลังจากรันสปริงบูตโดยใช้ URL นี้ ( http: // localhost: 8080 / h2-console / ) ตารางในคอนโซล H2 สามารถมองเห็นได้และอ่านเพื่อดูข้อมูลตารางนอกจากนี้คุณยังสามารถรันคำสั่ง SQL แบบง่ายได้ สิ่งหนึ่งในรหัส java ของคุณในขณะที่ดึงข้อมูลชื่อคอลัมน์จะเป็นตัวพิมพ์ใหญ่แม้ว่า schema.sql จะใช้ชื่อตัวพิมพ์เล็ก :)

spring.datasource.initialize=true
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=- 1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true

16

สำหรับSpring Boot 2.1.1จาก Spring Initialzr:

  1. ค่าเริ่มต้นของdevtoolsคือhttp://127.0.0.1:8080/h2-console/

    • POM: spring-boot-starter, h2, spring-boot-starter-web, spring-boot-devtools
  2. หากไม่มี devtools - คุณต้องตั้งค่าในคุณสมบัติ:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

    • POM: spring-boot-starter, h2, spring-boot-starter-web

เมื่อคุณไปถึงที่นั่น - ตั้งค่า JDBC URL: jdbc: h2: mem: testdb (ค่าเริ่มต้นจะไม่ทำงาน)


10

หากคุณใช้เครื่องมือสำหรับนักพัฒนาของ Spring Boot จะมาพร้อมกับ H2 Console ที่เปิดใช้งานโดยค่าเริ่มต้น สามารถเข้าถึงได้จาก/h2-console/ บนอินเตอร์เฟซการเข้าสู่ระบบสำหรับการป้อนข้อมูลค่าใช้JDBC URL jdbc:h2:mem:testdbใส่ใจกับmemสตริง

หากคุณไม่ได้ใช้ฤดูใบไม้ผลิ Boot ของเครื่องมือสำหรับนักพัฒนาคุณสามารถเปิดใช้คอนโซลในการใช้application.properties นี้จะช่วยให้คอนโซลภายใต้spring.h2.console.enabled=true /h2-consoleหากคุณต้องการเปลี่ยน URL คุณสามารถเพิ่มรายการอื่นด้วยspring.h2.console.path=my_console_path.

testdbชื่อสคีเริ่มต้นคือ

รายละเอียดเพิ่มเติมในฤดูใบไม้ผลิ Boot เอกสาร


4
เหตุใดจึงไม่jdbc:h2:mem:testdbตั้งค่าเป็น URL เริ่มต้นของ jdbc ฉันใช้เวลาไตร่ตรองว่าหน่วยงาน jpa ของฉันผิดพลาดตรงไหน
Sudip Bhandari

10

ตรวจสอบแอปพลิเคชันสปริงคุณสมบัติ

spring.datasource.url = jdbc: h2: mem: testdb; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE

ที่นี่ testdb กำหนดฐานข้อมูลตรวจสอบให้แน่ใจว่าคอนโซล h2 มีค่าเดียวกันในขณะที่เชื่อมต่ออื่น ๆ ที่ชาญฉลาดมันจะเชื่อมต่อกับฐานข้อมูลเริ่มต้น

ป้อนคำอธิบายภาพที่นี่


1
คำตอบไร้ที่ติ!
Gaurav

6

ในการรับตารางสิ่งที่คุณต้องทำคือสร้างไฟล์ sql 2 ไฟล์ schema.sql (สำหรับการสร้างตาราง) และ data.sql (ข้อมูลสำหรับตารางที่สร้าง) ไฟล์เหล่านี้จะใส่ในโฟลเดอร์ src / main / resources Spring boot อัตโนมัติจะตรวจจับและดูแลส่วนที่เหลือระหว่างรันไทม์

หากคุณใช้มากกว่า 2 DB ในโปรเจ็กต์ของคุณให้แน่ใจว่าได้ใช้ไฟล์เฉพาะเช่น (schema-h2.sql - สำหรับ h2 DB, schema-oracle.sql - สำหรับ oracle DB) เช่นเดียวกันที่จะติดตามสำหรับ data.sql ด้วย

ตรวจสอบให้แน่ใจว่าคุณวางตารางโดยเพิ่มคำสั่ง drop table ใน schema.sql เป็นคำสั่งแรก เพื่อหลีกเลี่ยงการผนวกระเบียนที่ซ้ำกัน

ลิงค์สำหรับสปริงบูตอยู่ที่นี่

application.properties ของฉันมีดังนี้

spring.datasource.url=jdbc:h2:~/file/Shiva;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.platform=h2
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.datasource.initialize=true 
spring.error.whitelabel.enabled=true
spring.h2.console.path=/console
spring.datasource.continue-on-error=true
spring.jpa.hibernate.ddl-auto=create
spring.hibernate.hbm2ddl.auto=update
spring.hibernate.show_sql=true

คุณสามารถทำตามขั้นตอนในลิงค์ด้านล่าง

https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/


"spring.jpa.hibernate.ddl-auto" สองครั้งโดยมีค่าต่างกัน ...
Yura

3

ฉันพบว่าด้วย spring boot 2.0.2.RELEASE การกำหนดค่า spring-boot-starter-data-jpa และ com.h2database ในไฟล์ POM นั้นไม่เพียงพอที่จะให้คอนโซล H2 ทำงานได้ คุณต้องกำหนดค่า spring-boot-devtools ดังต่อไปนี้ คุณสามารถเลือกที่จะทำตามคำแนะนำจาก Aaron Zeckoski ในโพสต์นี้

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
 </dependency>

3

ใช้ jdbc: h2: mem: testdb เป็นพา ธ ของคุณเมื่อล็อกอินเข้าสู่คอนโซล H2

เห็นได้ชัดว่าหากคุณเปลี่ยนคุณสมบัติ Spring Boot แหล่งข้อมูลของคุณอาจแตกต่างออกไป แต่ดูเหมือนว่าคุณกำลังดิ้นรนกับวิธีค้นหาค่าเริ่มต้น นั่นคือทั้งหมดที่มีให้! คุณจะเห็นสคีมาของคุณหลังจากลงชื่อเข้าใช้ H2


1

ฉันได้ทำผิดพลาดอย่างมากเมื่อฉันมีปัญหาเดียวกันนี้ ฉันได้เพิ่ม H2 DB สำหรับการทำงานกรณีทดสอบหน่วยและด้วยเหตุนี้ผมได้ตั้งค่าscopeไปในtest pom.xmlในขณะที่เรียกใช้แอปพลิเคชันโดยใช้mvn spring:runฉันได้ลบscopeและใช้งานได้ดีในขณะนี้


1

สำหรับ Spring Boot 2.3.3 RELEASE ตรงจาก Spring Initialzr:

ปอม: data jpa, h2, web

คุณสมบัติการใช้งาน: spring.h2.console.enabled=true

เมื่อคุณเรียกใช้แอปพลิเคชันให้มองหาบรรทัดด้านล่างในรันคอนโซล:

2020-08-18 21:12:32.664  INFO 63256 --- [           main] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:eaa9d6da-aa2e-4ad3-9e5b-2b60eb2fcbc5'

ตอนนี้ใช้ด้านบน JDBC URL สำหรับ H2 Connectคอนโซลและคลิกที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.