207 votes

Base de données de H2 en mémoire. Table introuvable

J’ai une base de données de H2 avec l’URL . Je crée un tableau à l’aide de . J’ai ensuite sélectionner tous les éléments de cette table (vide) à l’aide de `` . Pour l'instant ça va.

Cependant, si je change l’URL à , la seule différence étant la base de données est maintenant en mémoire uniquement, cela me donne un . Il me manque probablement quelque chose de simple ici, mais toute aide serait appréciée.

383voto

reini2901 Points 1056

Si vous avez votre url de connexion configuré comme ceci

le contenu de la base de données est perdu à l’heure actuelle, que la dernière connexion est fermée.

Si vous voulez garder votre contenu, que vous devez configurer l’url comme ceci

Si, ce faisant, h2 gardera son contenu tant que vit la vm .

133voto

Cristian Vrabie Points 1250

Je sais que ce n’était pas votre cas, mais j’ai eu le même problème parce que H2 créait les tables avec des noms en majuscules puis se comporter la casse, même si dans tous les scripts (y compris la création ones), j’ai utilisé en minuscules.

Résolu en ajoutant `` à l’URL de connexion.

12voto

Joseph Ottinger Points 2850

Difficile à dire. J’ai créé un programme pour tester ceci :

L’épreuve est terminée, avec aucun échec et aucune sortie inattendue. Quelle version de h2 courez-vous ?

8voto

Luke Woodward Points 20417

Le H2 en mémoire de la base de données stocke les données dans la mémoire à l'intérieur de la JVM. Lorsque la JVM des sorties, de perte de ces données.

Je soupçonne que ce que vous faites est similaire pour les deux classes Java ci-dessous. L'une de ces classes crée une table et l'autre essaie d'insérer:

import java.sql.*;

public class CreateTable {
    public static void main(String[] args) throws Exception {
        DriverManager.registerDriver(new org.h2.Driver());
        Connection c = DriverManager.getConnection("jdbc:h2:mem:test");
        PreparedStatement stmt = c.prepareStatement("CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64))");
        stmt.execute();
        stmt.close();
        c.close();
    }
}

et

import java.sql.*;

public class InsertIntoTable {
    public static void main(String[] args) throws Exception {
        DriverManager.registerDriver(new org.h2.Driver());
        Connection c = DriverManager.getConnection("jdbc:h2:mem:test");
        PreparedStatement stmt = c.prepareStatement("INSERT INTO PERSON (ID, FIRSTNAME, LASTNAME) VALUES (1, 'John', 'Doe')");
        stmt.execute();
        stmt.close();
        c.close();
    }
}

Quand j'ai couru ces classes, l'une après l'autre, j'ai obtenu le résultat suivant:

C:\Users\Luke\stuff>java CreateTable

C:\Users\Luke\stuff>java InsertIntoTable
Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "PERSONNE" n'est pas trouvée; instruction SQL:
INSERT INTO PERSONNE (ID, PRENOM, NOM) VALUES (1, 'Jean', 'Untel") [42102-154]
 au org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
 au org.h2.message.DbException.get(DbException.java:167)
 au org.h2.message.DbException.get(DbException.java:144)
...

Dès que la première java processus s'arrête, la table créée par CreateTable n'existe plus. Ainsi, lorsque l'InsertIntoTable classe vient, il n'y a pas de table pour les insérer dans.

Quand j'ai changé les chaînes de connexion pour l' jdbc:h2:test, j'ai trouvé qu'il n'y a aucune erreur. J'ai aussi trouvé qu'un fichier test.h2.db était apparu. C'est là que H2 avait mis la table, et depuis qu'il a été stocké sur le disque, la table était toujours là pour le InsertIntoTable classe à trouver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X