2015-03-09 36 views
17

Ứng dụng Grails của tôi sử dụng cơ sở dữ liệu h2 trong chế độ dev (hành vi mặc định cho ứng dụng Grails). Cài đặt kết nối DB trong DataSource.groovyKết nối với cơ sở dữ liệu H2 bằng ứng dụng khách IntelliJ cơ sở dữ liệu

dataSource { 
    pooled = true 
    jmxExport = true 
    driverClassName = "org.h2.Driver" 
    username = "sa" 
    password = "" 
    dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', '' 
    url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE" 
} 

Tôi đang cố gắng để thiết lập một kết nối cơ sở dữ liệu cho này sử dụng các công cụ cơ sở dữ liệu khách hàng IntelliJ IDEA của. Tôi bắt đầu tạo kết nối như vậy

enter image description here

Sau đó, trong hộp thoại sau đây, tôi nhập URL JDBC

enter image description here

Và chọn tất cả các cơ sở dữ liệu có sẵn trên "Schemas & Bàn" tab .

enter image description here

Nút "Test Connection" chỉ ra thành công, nhưng khi bạn có thể nhìn thấy từ vòng tròn màu đỏ, không có bảng được tìm thấy. Có vẻ như tôi đã thiết lập chính xác kết nối với máy chủ h2, nhưng không phải là chính lược đồ đó.

BTW, tôi cố gắng thiết lập kết nối này khi ứng dụng đang chạy, vì vậy tôi chắc chắn rằng lược đồ/bảng thực sự tồn tại.

+0

Bạn đã bao giờ con số này ra? Tôi đã sử dụng các đề xuất của Mark để không có kết quả (sử dụng AUTO_SERVER = TRUE và DB được nhúng trong thư mục gốc). Tôi không bao giờ có thể duyệt một db H2 từ Intellij. Điều này đã trở nên vô cùng khó khăn. – Jack

Trả lời

30

Cấu hình của bạn là dành cho cơ sở dữ liệu h2:mem. Cơ sở dữ liệu bộ nhớ không có bảng khi kết nối với chúng và bất kỳ & tất cả các bảng đều bị mất khi tất cả các kết nối được đóng lại. Hơn nữa, một (có tên) trong cơ sở dữ liệu bộ nhớ là duy nhất cho quá trình JVM mở nó. Từ số H2 documentation:

Đôi khi phải kết nối nhiều kết nối với cùng một cơ sở dữ liệu trong bộ nhớ. Trong trường hợp này, URL cơ sở dữ liệu phải bao gồm tên. Ví dụ: jdbc: h2: mem: db1. Truy cập cùng cơ sở dữ liệu bằng cách sử dụng URL này chỉ hoạt động trong cùng một môi trường máy ảo và trình nạp lớp. (Nhấn mạnh thêm)

Điều này có nghĩa IDEA sẽ tạo ra một độc đáo devDb trong JVM (và classloader) không gian và ứng dụng của bạn sẽ tạo ra một độc đáo trong không gian devDb JVM (và classloader) của nó. Bạn không thể kết nối với cơ sở dữ liệu trong bộ nhớ từ một quá trình JVM bên ngoài.

Nếu bạn muốn kết nối cả hai ứng dụng của bạn và IntelliJ IDEA (hoặc bất kỳ công cụ DB khác) đến một cơ sở dữ liệu H2 cùng một lúc, bạn sẽ cần một trong hai

  1. sử dụng một cơ sở dữ liệu nhúng (mà ghi vào một tập tin) trong ứng dụng của bạn và sử dụng để cho phép Mixed Mode IntelliJ IDEA (và/hoặc các công cụ cơ sở dữ liệu khác) để kết nối với nó
  2. sử dụng một cơ sở dữ liệu chế độ máy chủ

Xem http://www.h2database.com/html/features.html#connection_modes để biết thêm thông tin.

+0

cho những người tự hỏi cách bật chế độ hỗn hợp: jdbc: h2: ~/test; AUTO_SERVER = TRUE (cả trong cấu hình ứng dụng và cài đặt trình quản lý ý tưởng db) – deviant

10

Bài viết này có ghi công tuyệt vời về cách thiết lập các khách hàng cơ sở dữ liệu IntelliJ để kết nối với một H2 cơ sở dữ liệu trong bộ nhớ nếu bạn tình cờ được sử dụng Spring Boot: https://techdev.io/en/developer-blog/querying-the-embedded-h2-database-of-a-spring-boot-application

Về cơ bản, bạn bọc cơ sở dữ liệu trong bộ nhớ với máy chủ tcp, sau đó bạn có một điểm truy cập để kết nối với máy khách sql thông qua truy cập từ xa.

+1

Liên kết đã chết ngay bây giờ :-( – Rob

+2

https://techdev.io/ vi/developer-blog/truy vấn-nhúng-h2-cơ sở dữ liệu-of-a-spring-boot-application – DRaehal

+0

Đây phải là câu trả lời được chấp nhận! Cảm ơn rất nhiều! – www

Các vấn đề liên quan