HOAB

History of a bug

H2 base mémoire et client WEB intégré

Rédigé par gorki Aucun commentaire

Le problème :

La base H2 intègre un mode SERVEUR comme Hsqldb ou Derby, mais aussi un mode mixe qui permet au premier client connecté à la base de démarrer un serveur.

Très pratique, en utilisant un client quelconque , on peut se connecter au serveur !

Deux problèmes :

  • quel client ?
  • le mode serveur, OK, mais il ne fonctionne pas avec la base mémoire embarquée !

Solution : quel client ?

Tombé un peu par hasard dessus : ici sur stackoverflow

Il y a une liste ici : http://h2database.com/html/links.html#tools

La console WEB n'est pas intégrée au driver H2, même si dans la librairie H2 il y a la console H2 ; au départ je pensais qu'on aurais pu y accéder en tapant l'URL de la base de données + /console par exemple :)

Pour la console H2 :

  • soit vous avez le raccourci si vous avez installé H2, cf la doc
  • soit via le jar : java org.h2.tools.Console -web -browser
  • sinon, on peut la démarrer tout simplement :
import java.sql.SQLException;
import org.h2.tools.Console;


public class H2Client {

    public static void main(String[] args) {
        try {
            new Console().runTool();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Entrer l'url indiquée dans la configuration ou affichée lors du lancement du serveur pour la base mémoire.

Solution : serveur et base mémoire ?

Idem, dans le même post : ici sur stackoverflow

Sur disque

Ajouter AUTOSERVER=TRUE à la fin de la déclaration de la base de données :

Exemple :

jdbc:h2:~/my-database/db2;AUTO_SERVER=TRUE

En base mémoire

Il faut démarrer le serveur dans la JVM qui utilise la base mémoire embarquée :

Pour la déclaration base mémoire classique :

  • jdbc:h2:mem:test
            Server server = Server.createTcpServer().start();
            System.out.println("URL du serveur H2 : jdbc:h2:" + server.getURL() + "/mem:test");

Notez le "mem:test" à la fin de l'URL, à adapter si vous modifier la votre.

En fin de démarrage de Spring Boot, ça donne :

    @Bean
    public Server initH2Server() {
        try {
            Server server = Server.createTcpServer().start();
            System.out.println("URL: jdbc:h2:" + server.getURL() + "/mem:test");
            return server;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
Fil RSS des articles de ce mot clé