Récemment, j’ai rejoint une nouvelle équipe et ici, les gars utilisent h2 pour le service Stub.
Je me demandais si je pouvais afficher le contenu de cette base de données à l'aide de l'interface Web. Au travail, il est disponible en allant à localhost:5080
J'ai un projet où j'utilise une base de données h2, mais je ne vois pas la console Web h2 lorsque je clique sur localhost:5080
J'ai aussi essayé localhost:8082
- ça ne marche 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 n'ai pas d'idées sur la façon d'accéder à la console Web H2. s'il vous plaît aider.
Je vois des mentions de h2 uniquement dans le dossier .m2
J'ai remarqué que la console Web 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 (dans le dossier .m2
, recherchez le fichier jar h2
et cliquez deux fois)
Si h2 n'est pas démarré quand je lance 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 démarre s'il n'a pas été démarré lorsque je lance mon application.
J'ai essayé d'écrire le 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écute et après j'essaie de taper localhost:9092
dans mon navigateur.
En ce moment, télécharge le fichier. inside file le contenu suivant:
Version mismatch, driver version is “0” but server version is “15”
ma version h2 1.4.182
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 cela fonctionne toujours)
Divisons la question en deux parties.
Selon la manière dont vous spécifiez la connexion à H2, vous obtiendrez différents modes de fonctionnement.
Les modes sont: incorporé, en mémoire, serveur.
jdbc:h2:~/test
vous donne une instance H2 en mode incorporé . Le mode incorporé a la limitation de n'être accessible que par le même chargeur de classes et la même machine virtuelle Java ( proof )
jdbc:h2:mem:test
vous obtient une instance H2 en mémoire. C’est aussi non accessible du monde extérieur.
jdbc:h2:tcp://localhost/test
démarrera le serveur H2 et il sera accessible de l'extérieur de la machine virtuelle en mode serveur mais avec une limitation - le serveur doit être démarré avant la connexion.
La dernière limitation est à l'origine de votre exception Connection refused: connect: localhost"
.
Pour tout résumer:
jdbc:h2:tcp://localhost/test
comme chaîne de connexionMettre à jour
Je viens de remarquer que vous souhaitez démarrer le serveur au cours du processus de lancement de l'application.
Vous pouvez le faire de différentes manières, en fonction du démarrage de l'application:
Mise à jour 2
Si la connexion à la base de données locale est nécessaire uniquement à des fins de développement/débogage, je configurerais tout en utilisant le profil maven. Les réponses de cette question résoudront cela.
Si vous avez besoin d'accéder à la base de données H2 en production (je peux difficilement imaginer un cas d'utilisation pour cela), il est préférable de le faire au printemps. Principalement parce que la configuration du conteneur/de l'environnement de l'application est susceptible d'être différente en production (par rapport à l'environnement de développement).
Pour répondre à la question de savoir si le serveur doit être démarré en dehors du contexte Spring - tout dépend des besoins .. Un point à noter est que le serveur doit être démarré avant que la source de données ne soit démarrée (sinon le contexte de printemps ne se chargera pas)
Mise à jour 3
Malheureusement, je ne suis pas en mesure de vous donner une solution opérationnelle, mais selon le JavaDocs, il existe une différence entre le serveur TCP et le serveur Web . Regardez de plus près le JavaDoc de la classe H2 Server .
Je suppose que vous devriez utiliser la méthode Server.createWebServer()
pour créer le serveur (la différence entre le serveur TCP et le serveur Web est la suivante:
Une autre grande classe que vous pourriez utiliser org.h2.tools.Console
( JavaDoc ici ) Il suffit d’exécuter la méthode principale de Console et j’imagine que cela devrait tout résoudre.
Que diriez-vous de changer l’URL de jdbc dans la configuration pour inclure
AUTO_SERVER=TRUE
pour démarrer h2 automatiquement.
Plusieurs processus peuvent accéder à la même base de données sans avoir à démarrez le serveur manuellement. Pour ce faire, ajoutez AUTO_SERVER = TRUE au fichier URL de la base de données. Vous pouvez utiliser la même URL de base de données indépendamment du fait que la base de données est déjà ouverte ou non. Cette fonctionnalité ne fonctionne pas avec bases de données en mémoire.
Utilisez la même URL pour toutes les connexions à cette base de données. En interne, lorsque vous utilisez ce mode, le fichier la première connexion à la base de données est faite en mode intégré, et De plus, un serveur est démarré en interne (en tant que thread démon). Si la base de données est déjà ouverte dans un autre processus, le mode serveur est utilisé automatiquement.
Vous devez pouvoir utiliser les variantes en mémoire ou basées sur fichier, puis lancer dans votre application le serveur H2 TCP séparément, par exemple. en utilisant un bean Spring (attention au semi-pseudo-code et au port exemple):
@Component
class Bootstrap {
@PostConstruct
public void startH2TcpServer() {
Server.createTcpServer("-tcpPort", "9123", "-tcpDaemon").start();
}
}
Voir http://www.h2database.com/html/tutorial.html#using_server