Comment afficher le contenu de la base de données locale h2(console web)?

récemment j'ai rejoint une nouvelle équipe et ici les gars utilisent h2 pour le service de talon.

je me demandais si je pouvais afficher le contenu de cette base de données en utilisant l'interface web. Au travail, il est disponible en allant sur localhost:5080

j'ai un projet où j'utilise la base de données h2, mais je ne peux pas voir la console web h2 quand j'appuie sur localhost:5080

j'ai essayé aussi localhost:8082 - il ne fonctionnera pas non plus.

ma configuration de projet (fonctionne avec succès):

     <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
        <property name="targetName" value="dataSource" />
     </bean>

     <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
            <property name="targetName" value="dataSource" />
        </bean>

        <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
            <property name="driverClassName" value="org.h2.Driver" />
            <property name="url" value="jdbc:h2:~/test;MODE=PostgreSQL" />
            <property name="username" value="sa" />
            <property name="password" value="" />
        </bean>

        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="wrappedDataSource"/>
            <property name="configLocation">
                <value>classpath:hibernate-test.cfg.xml</value>
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.show_sql">false</prop>
                    <prop key="hibernate.connection.charSet">UTF-8</prop>
                    <prop key="hibernate.format_sql">true</prop>
                    <prop key="hbm2ddl.auto">create-drop</prop>
                </props>
            </property>
        </bean>

        <context:property-placeholder location="classpath:jdbc.properties"/>

Je ne sais pas comment accéder à la console web h2. s'il vous plaît aider.

P.S.

je vois les mentions de h2 que dans .m2 dossier

P.S. 2

j'ai remarqué que la console web est disponible par http://localhost:8082/ si remplacer url dans la configuration avec:

<property name="url" value="jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL" />

Mais cela fonctionne si je démarre déjà h2 (en .m2 dossier à rechercher h2 fichier jar et a frappé un double clic)

si h2 n'est pas démarré, quand je démarre l'application, je vois l'erreur suivante:

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:94)
    ...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dbInitializer': Invocation of init method failed; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
    ...
Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    ...
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Соединение разорвано: "java.net.ConnectException: Connection refused: connect: localhost"
Connection is broken: "java.net.ConnectException: Connection refused: connect: localhost" [90067-182])
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
    ...
Caused by: org.h2.jdbc.JdbcSQLException: Соединение разорвано: "java.net.ConnectException: Connection refused: connect: localhost"
Connection is broken: "java.net.ConnectException: Connection refused: connect: localhost" [90067-182]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    ...
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    ...

je veux réaliser que h2 commence si elle n'a pas commencé quand je démarre ma demande.

P.S. 3

j'ai essayé de l'écrit code suivant:

Server server = null;
try {
    server = Server.createTcpServer("-tcpAllowOthers").start();
    Class.forName("org.h2.Driver");
    Connection conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL", "sa", "");
 } catch (Exception e) {
    LOG.error("Error while initialize", e);
 }

je l'exécuter et après j'essaie de type localhost:9092 dans mon navigateur.

À ce moment, les téléchargements de fichiers. à l'intérieur de fichier le contenu suivant:

Version mismatch, driver version is “0” but server version is “15”

ma version h2 1.4.182

P.S. 4

Ce code fonctionne:

public class H2Starter extends ContextLoaderListener {
    private static final Logger LOG = LoggerFactory.getLogger(H2Starter.class);

    @Override
    public void contextInitialized(ServletContextEvent event) {

        startH2();
        super.contextInitialized(event);
    }

    private static void startH2() {

        try {
            Server.createTcpServer("-tcpAllowOthers").start();
            Class.forName("org.h2.Driver");
            DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL;AUTO_SERVER=TRUE", "sa", "");

            Server.createWebServer().start();
        } catch (Exception e) {
            LOG.error("cannot start H2 [{}]", e);
        }
    }

    public static void main(String[] args) {
        startH2();
    }
}

mais je n'ai besoin de l'invoquer que lorsque le profil du ressort en béton est actif(maintenant il fonctionne toujours)

18
demandé sur itoctopus 2015-12-12 12:06:44

3 réponses

divisons la question en deux parties.

selon la façon dont vous spécifiez la connexion à H2, vous obtiendrez différents modes opérationnels.

les Modes sont: Embedded, in-Memory, Server.

jdbc:h2:~/test vous donne une instance H2 dans mode embarqué. Le mode embarqué a une limitation d'être accessible seulement par le même chargeur de classe et la même JVM (preuve)

jdbc:h2:mem:test Vous donne une instance H2 en mémoire. C'est aussi accessible à partir du monde extérieur.

jdbc:h2:tcp://localhost/test va démarrer le serveur H2 et il sera accessibilité à partir de l'extérieur de la JVM serveur mais avec une limitation - le serveur doit être démarré avant la connexion.

la dernière limitation provoque votre Connection refused: connect: localhost" exception.

Pour la somme de tout:

  • démarrer le serveur H2 avant vous commencez à application
  • utiliser jdbc:h2:tcp://localhost/test comme chaîne de connexion
  • ....
  • bon codage :)

mise à Jour

Juste remarqué que vous souhaitez démarrer le serveur dans le processus de lancement de l'application.

Vous pouvez le faire de plusieurs façons, selon comment vous démarrez l'application:

  • si vous utilisez maven / gradle il est plus facile pour vous d'ajouter un certain profil / tâche de sorte qu'il obtient exécuté avant le début de l'application.
  • Si vous avez de l'installation tout en java, je vous suggère de regarder ce question

mise à Jour 2

si la connexion à la base de données locale n'est nécessaire qu'à des fins de développement / débogage, je configurerais tout en utilisant Maven profile. Des réponses à partir de cette question permet de résoudre ce problème.

si vous avez besoin d'accéder à la base de données H2 en production (I peut difficilement imaginer un cas d'utilisation pour que) il est préférable de le faire au printemps. Principalement parce que la configuration du conteneur d'application / environnement est susceptible d'être différente en production (par rapport à l'environnement de développement).

pour répondre à la question de savoir si démarrer le serveur en dehors du contexte de Spring ou non - tout dépend des exigences. Une chose à noter est que le serveur doit être démarré avant la source de données est lancée (sinon le printemps le contexte ne se charge pas)

mise à Jour 3

malheureusement je ne suis pas en mesure de vous donner une solution de travail, mais selon les JavaDocs il y a une différence entre le serveur TCP et le serveur Web. Regardez de plus près à l' JavaDoc de la classe de serveur H2.

je suppose que vous devez utiliser Server.createWebServer() méthode pour créer le serveur (la différence entre le serveur TCP et le serveur Web est que

une autre grande classe que vous pourriez utiliser org.h2.tools.Console ( JavaDoc ici) Il suffit d'exécuter la méthode principale de la Console et je suppose que cela devrait résoudre tout.

18
répondu WeMakeSoftware 2017-05-23 12:34:37

Vous devriez être capable d'utiliser les variantes en mémoire ou basées sur des fichiers, et ensuite dans votre application activez le serveur TCP H2 séparément, par exemple en utilisant un bean de ressort (faites attention au semi-pseudo code et au port d'échantillon):

@Component
class Bootstrap {
    @PostConstruct
    public void startH2TcpServer() {
         Server.createTcpServer("-tcpPort", "9123", "-tcpDaemon").start();
    }
}

voir http://www.h2database.com/html/tutorial.html#using_server

1
répondu Jukka 2015-12-18 11:26:00

Que Diriez-vous de changer l'url jdbc dans la configuration pour inclure

AUTO_SERVER=TRUE 

pour démarrer H2 automatiquement.

Voir mode mixte automatique

Plusieurs processus peuvent accéder à la même base de données sans avoir à démarrer le serveur manuellement. Pour ce faire, ajoutez; AUTO_SERVER=TRUE to the base de données d'URL. Vous pouvez utiliser la même URL de base de données indépendamment de si la base de données est déjà ouvert ou pas. Cette fonctionnalité ne fonctionne pas avec en mémoire les bases de données.

Utilisez la même URL pour toutes les connexions à cette base de données. En interne, en utilisant ce mode, le la première connexion à la base de données se fait en mode intégré, et de plus un serveur est lancé en interne (comme un fil de démon). Si la base de données est déjà ouverte dans un autre processus, le mode serveur est utilisé automatiquement.

1
répondu Willmore 2015-12-18 17:44:42