2010-05-04 5 views
9

ich Probleme habe mit einer im Speicher Tabelle erstellen, mit H2-Datenbank, und es außerhalb der JVM zugreifen es erstellt wird und läuft in.h2 In-Memory-Tabellen, Remote-Verbindung

Die Dokumentationsstrukturen die URL als jdbc:h2:tcp://<host>/mem:<databasename>

Ich habe viele Kombinationen ausprobiert, aber kann einfach nicht die Remote-Verbindung funktionieren. Funktioniert diese Funktion, kann mir jemand die Details geben, wie sie das benutzt haben.

+0

Wäre gut, wenn Sie die Kombinationen aufgelistet haben, die Sie ausprobiert haben. –

+0

Haben Sie ein Problem mit dem Einrichten des Servers (zum Abhören eines TCP-Ports) oder des Clients (zum Herstellen einer Verbindung zum Server)? –

Antwort

10

Sie könnten sich In-Memory Databases ansehen. Für eine Netzwerkverbindung benötigen Sie einen Host- und einen Datenbanknamen. Es sieht aus wie Sie wollen jdbc:h2:tcp://localhost/mem:db1 oder jdbc:h2:tcp://127.0.0.1/mem:db1

2

Nachdem dieses Problem nur stand ich fand ich DB_CLOSE_DELAY=-1 auf die JDBC-URL für die TCP-Verbindung anhängen benötigt. Also meine URLs waren:

  • Speicher: jdbc:h2:mem:dbname
  • TCP-Verbindung: jdbc:h2:tcp://localhost:9092/dbname;DB_CLOSE_DELAY=-1

From the h2 docs:

standardmäßig die letzte Verbindung zu einer Datenbank zu schließen schließt die Datenbank . Bei einer In-Memory-Datenbank bedeutet dies, dass der Inhalt verloren gegangen ist. Um die Datenbank offen zu halten, fügen Sie ;DB_CLOSE_DELAY=-1 zur Datenbank URL hinzu.

Nicht einschließlich DB_CLOSE_DELAY=-1 bedeutet, dass ich keine Verbindung zur richtigen Datenbank über TCP herstellen kann. Die Verbindung wird hergestellt, aber sie verwendet eine andere Version als diejenige, die im Speicher erstellt wurde (validiert mit dem Parameter IFEXISTS=true)

5

Keine der bis jetzt erwähnten Lösungen funktionierte für mich. Remote-Teil konnte nicht verbinden.

Nach H2 den official documentation:

Für den Zugriff auf eine Datenbank im Speicher von einem anderen Prozess oder von einem anderen Computer, benötigen Sie einen TCP-Server im gleichen Prozess zu starten, wie die In-Memory-Datenbank erstellt wurde. Die anderen Prozesse müssen dann über TCP/IP oder TLS auf die Datenbank zugreifen. Verwenden Sie dazu eine Datenbank-URL wie zum Beispiel: jdbc: h2: tcp: // localhost/mem: db1.

Ich markierte den entscheidenden Teil des Textes in Fettdruck.

Und ich fand eine Arbeitslösung bei diesem blog Kerl:

Der erste Prozess die DB mit der folgenden URL wird erstellen:

jdbc:h2:mem:db1

und es wird brauchen Starten eines TCP-Servers:

org.h2.tools.Server server = org.h2.tools.Server.createTcpServer().start();

Zugang

Die anderen Prozesse können dann Ihre DB die folgende URL unter Verwendung:

"jdbc:h2:tcp://localhost/mem:db1"

Und das ist es! Lief wie am Schnürchen!