2015-03-09 9 views
17

Meine Grails-App verwendet eine h2-Datenbank im Entwicklungsmodus (das Standardverhalten für Grails-Apps). Die DB-Verbindungseinstellungen in DataSource.groovy sindVerbinden mit der H2-Datenbank mithilfe des IntelliJ-Datenbankclients

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" 
} 

Ich Setup eine Verbindung zu dieser Datenbank versucht, mit IntelliJ Datenbank-Client-Tools IDEA. Ich beginne die Verbindung zu schaffen, wie so

enter image description here

dann im folgenden Dialog, gebe ich die JDBC-URL

enter image description here

und wähle alle verfügbaren Datenbanken auf dem "Schemen & Tables" tab .

enter image description here

Die „Test Connection“ Taste zeigt den Erfolg, aber wie Sie aus dem roten Kreis sehen kann, werden keine Tabellen gefunden. Es scheint, als ob ich eine Verbindung zum h2-Server eingerichtet habe, aber nicht das Schema selbst.

BTW, ich versuche, diese Verbindung einzurichten, sobald die App ausgeführt wird, also bin ich mir sicher, dass das Schema/die Tabellen tatsächlich existieren.

+0

Haben Sie jemals herausgefunden? Ich habe die Empfehlungen von Mark missbraucht (benutze AUTO_SERVER = TRUE und eingebettete DB im root-Verzeichnis). Ich kann nie scheinen, eine H2 db von Intellij zu durchsuchen. Das ist lächerlich schwierig geworden. – Jack

Antwort

30

Ihre Konfiguration ist für eine h2:mem Datenbank. Speicher-Datenbanken haben keine Tabellen beim Verbinden mit ihnen und alle & alle Tabellen sind verloren, wenn alle Verbindungen geschlossen sind. Darüber hinaus ist eine (named) in der Speicherdatenbank einzigartig für den JVM-Prozess, der sie öffnet. Von der H2 documentation:

Manchmal sind mehrere Verbindungen zu derselben In-Memory-Datenbank erforderlich. In diesem Fall muss die Datenbank-URL einen Namen enthalten. Beispiel: jdbc: h2: mem: db1. Der Zugriff auf die gleiche Datenbank unter Verwendung dieser URL funktioniert nur in derselben Umgebung für virtuelle Maschinen und Klassenladeprogramme. (Hervorhebung hinzugefügt)

Das bedeutet IDEA wird eine einzigartige devDb in seiner JVM (und Classloader) Raum erstellen und Ihre Anwendung wird eine einzigartige devDb in seiner JVM (und Classloader) Raum. Sie können keine Verbindung zu einer In-Memory-Datenbank aus einem externen JVM-Prozess herstellen.

Wenn Sie sowohl Ihre Anwendung und IntelliJ IDEA (oder einem anderen DB-Tool) zu einer H2-Datenbank zur gleichen Zeit eine Verbindung herstellen möchten, müssen Sie entweder

  1. eine eingebettete Datenbank verwenden (das schreibt eine Datei) in Ihrer Anwendung und verwendet Mixed Mode IntelliJ IDEA (und/oder andere Datenbank-Tools) zu verbinden, damit es
  2. eine Server-Modus-Datenbank verwendet

http://www.h2database.com/html/features.html#connection_modes für weitere Informationen.

+0

für diejenigen, die sich fragen, wie man den gemischten Modus aktiviert: jdbc: h2: ~/test; AUTO_SERVER = TRUE (sowohl in der App-Konfiguration als auch in den db-Manager-Einstellungen) – deviant

10

Dieser Artikel hat eine große aufzuschreiben, wie die IntelliJ Datenbank-Client einzurichten zu einem H2-In-Memory-Datenbank zu verbinden, wenn Sie Frühlings-Boot mit passieren werden: https://techdev.io/en/developer-blog/querying-the-embedded-h2-database-of-a-spring-boot-application

Grundsätzlich wickeln Sie die In-Memory-Datenbank mit einem TCP-Server, dann haben Sie einen Zugriffspunkt, um eine Verbindung mit einem SQL-Client über Remotezugriff herzustellen.

+1

Link ist jetzt tot :-( – Rob

+2

https://techdev.io/ de/developer-blog/query-the-embedded-h2-datenbank-of-a-spring-boot-application – DRaehal

+0

Dies sollte eine akzeptierte Antwort sein! Vielen Dank! – www

Verwandte Themen