web-dev-qa-db-fra.com

Afficher le contenu de la base de données H2 intégrée démarrée par Spring

Je souhaite visualiser dans un navigateur web le contenu de la base de données H2 démarrée par Spring grâce à la configuration suivante:

<jdbc:embedded-database id="dataSource" type="H2" />

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="classpath:db/populateDB.sql"/>
</jdbc:initialize-database>

J'ai recherché l'URL JDBC dans les journaux:

DEBUG o.s.j.d.SimpleDriverDataSource - Creating new JDBC Driver Connection to [jdbc:h2:mem:dataSource;DB_CLOSE_DELAY=-1]

Afin que je puisse remplir le formulaire de connexion comme suit:

enter image description here

Mais malheureusement, la base de données est toujours vide, alors qu'elle ne devrait pas l'être en raison du script populateDB.sql.

Une idée?

Merci!

47
tduchateau

À peu près la même question que Voir le contenu de la base de données en mémoire H2 ou HSQLDB .

Ajoutez simplement ce qui suit à votre configuration.

<bean id="h2Server" class="org.h2.tools.Server" factory-method="createTcpServer" init-method="start" destroy-method="stop" depends-on="h2WebServer">
    <constructor-arg value="-tcp,-tcpAllowOthers,-tcpPort,9092"/>
</bean>
<bean id="h2WebServer" class="org.h2.tools.Server" factory-method="createWebServer" init-method="start" destroy-method="stop">
    <constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
</bean>

Cela démarrera à la fois la console Web H2 et le serveur TCP dans la même machine virtuelle Java que votre base de données intégrée afin que vous puissiez accéder au port 8082 avec votre navigateur Web (entrez jdbc: h2: mem: dataSource comme URL) ou accédez au port 9092 avec un client SQL externe tel que SQuirreLSQL et affichez les mêmes données.

48
hshib

Avec Spring Boot, vous pouvez le faire avec quelques configurations dans le fichier application.properties.

spring.h2.console.enabled=true
spring.h2.console.path=/console/

Ensuite, vous pouvez accéder à la console Web h2 dans http: // localhost: 8080/console / . La configuration de connexion par défaut devrait fonctionner sauf si vous les modifiez.

Voir Spring Boot documentation .

19
chAmi

L'URL de la base de données jdbc:h2:mem:dataSource signifie que vous utilisez une base de données en mémoire. Maintenant, si vous démarrez un deuxième processus Java et que vous vous connectez à cette base de données, vous finirez par avoir deux bases de données en mémoire (une pour chaque processus).

Si vous souhaitez vous connecter à la base de données existante, vous avez plusieurs options:

  • Connectez-vous à la base de données à partir du même processus. Ne lancez pas un deuxième processus.

  • Utilisez une base de données persistante, avec un chemin absolu codé en dur, par exemple: `jdbc: h2:/data/db/dataSource '.

  • Plus compliqué/déconseillé: si vous démarrez un deuxième processus, vous pouvez théoriquement vous connecter à une base de données en mémoire en utilisant le mode serveur. Mais cela signifie que vous devez démarrer le serveur sur lequel vous avez exécuté le test.

18
Thomas Mueller

Lorsque vous utilisez Spring Boot, vous pouvez enregistrer le servlet H2 Console comme suit:

@Bean
public ServletRegistrationBean h2servletRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new WebServlet());
    registration.addUrlMappings("/console/*");
    registration.addInitParameter("webAllowOthers", "true");
    return registration;
}

Si vous souhaitez que la console soit disponible à distance, la ligne importante est la addInitParameter pour définir la "webAllowOthers" à "true".

17
user2754985

Lorsque vous utilisez un embeddeb avec la configuration xml jdbc, le nom par défaut de la base de données est "testdb"

Essayez d'utiliser dans votre connexion URL:

jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
13
F. Geraerts

Pour ceux qui souhaitent une configuration Java Config, il est assez facile de faire aussi bien l'initialisation du serveur TCP lors de l'implémentation de ServletContextInitializer et du chaînage du serveur de console ...

@Configuration
public class WebConfig implements ServletContextInitializer{
...

@Override
public void onStartup( ServletContext servletContext )
//do stuff onStartUp...
initH2TCPServer( servletContext );
....    

@Bean(initMethod="start", destroyMethod="stop")
public Server initH2TCPServer(ServletContext servletContext) {
    log.debug( "Initializing H2 TCP Server" );
    try {
        server = Server.createTcpServer( "-tcp", "-tcpAllowOthers", "-tcpPort", "9092" );
    } catch( SQLException e ) {
        e.printStackTrace();
    } finally {
        //Always return the H2Console...
        initH2Console( servletContext );
    }
    return server;
}

public void initH2Console( ServletContext servletContext ) {
    log.debug( "Initializing H2 console" );
    ServletRegistration.Dynamic h2ConsoleServlet = servletContext.addServlet(
    "H2Console", new org.h2.server.web.WebServlet() );
    h2ConsoleServlet.addMapping( "/console/*" );
 );
}
3
Eddie B

J'étais confronté à un problème similaire. Mais le correctif était vraiment très petit. Veuillez vous référer à la page: https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/ pour plus de détails.

Dans mon cas, j'ai ajouté l'étendue de la dépendance H2 en tant que "runtime". Je l'ai supprimé et il a résolu mon problème. Non, je suis en mesure de voir les tableaux dans la console H2.

La dépendance précédente dans mon pom était:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Et une nouvelle dépendance qui a résolu mon problème:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>
0
Gunjan Shah