java - datos - h2 database descargar
¿Cómo mostrar el contenido de la base de datos h2 local(consola web)? (3)
Recientemente me uní a un nuevo equipo y aquí los chicos usan h2 para el servicio de stub.
Me preguntaba si puedo mostrar el contenido de esta base de datos mediante la interfaz web. En el trabajo está disponible yendo a localhost:5080
Tengo un proyecto en el que utilizo la base de datos h2, pero no puedo ver la consola web h2 cuando encuentro localhost:5080
Intenté también localhost:8082
- tampoco funciona.
La configuración de mi proyecto (funciona correctamente):
<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"/>
No tengo ideas de cómo acceder a la consola web h2. por favor ayuda.
PD
Veo menciones de h2 solo en la carpeta .m2
PS2
Noté que la consola web está disponible en http://localhost:8082/
si reemplaza url en la configuración con:
<property name="url" value="jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL" />
Pero funciona si ya comienzo h2 (en la carpeta .m2
encuentra el archivo jar h2
y .m2
doble clic)
Si no se inicia h2 cuando inicio la aplicación, veo el siguiente error:
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)
...
Quiero lograr que h2 se inicie si no se inicia cuando inicio mi aplicación.
PS3
He intentado escribir el siguiente código:
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);
}
Lo ejecuto y después intento escribir localhost:9092
en mi navegador.
En este momento descarga el archivo. Dentro del archivo el siguiente contenido:
Version mismatch, driver version is “0” but server version is “15”
mi versión h2 1.4.182
PS4
Este código funciona:
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();
}
}
pero necesito invocarlo solo cuando el perfil de resorte concreto esté activo (ahora funciona siempre)
¿Qué hay de cambiar jdbc url en la configuración para incluir
AUTO_SERVER=TRUE
para iniciar h2 automáticamente.
Varios procesos pueden acceder a la misma base de datos sin tener que iniciar el servidor manualmente. Para hacerlo, agregue; AUTO_SERVER = TRUE a la URL de la base de datos. Puede utilizar la misma URL de base de datos independientemente de si la base de datos ya está abierta o no. Esta característica no funciona con las bases de datos en memoria.
Use la misma URL para todas las conexiones a esta base de datos. Internamente, cuando se usa este modo, la primera conexión a la base de datos se realiza en modo incrustado y, además, un servidor se inicia internamente (como un hilo de daemon). Si la base de datos ya está abierta en otro proceso, el modo de servidor se utiliza automáticamente.
Debería poder usar las variantes en memoria o basadas en archivos, y luego, en su aplicación, inicie el servidor H2 TCP por separado, por ejemplo, utilizando un bean Spring (tenga en cuenta el código semipseudo y el puerto de muestra):
@Component
class Bootstrap {
@PostConstruct
public void startH2TcpServer() {
Server.createTcpServer("-tcpPort", "9123", "-tcpDaemon").start();
}
}
Consulte http://www.h2database.com/html/tutorial.html#using_server
Vamos a dividir la pregunta en dos partes.
Dependiendo de cómo especifique la conexión a H2, obtendrá diferentes modos de operación.
Los modos son: Embedded, In-Memory, Server.
jdbc:h2:~/test
le da una instancia H2 en modo integrado . El modo integrado tiene la limitación de ser accesible solo a través del mismo cargador de clases y la misma JVM ( proof )
jdbc:h2:mem:test
le proporciona una instancia H2 en la memoria. Eso tampoco es accesible desde el mundo exterior.
jdbc:h2:tcp://localhost/test
iniciará el servidor H2 y será accesible desde fuera del modo de servidor JVM pero con una limitación: el servidor debe iniciarse antes de que se realice la conexión.
La última limitación es la causa de que su Connection refused: connect: localhost"
excepción.
Para resumir todo:
- iniciar el servidor H2 antes de iniciar la aplicación
- use
jdbc:h2:tcp://localhost/test
como cadena de conexión - ....
- feliz codificación :)
Actualizar
Acabo de notar que desea iniciar el servidor en el proceso de inicio de la aplicación.
Puede hacerlo de varias maneras, dependiendo de cómo inicie la aplicación:
- Si está utilizando maven / gradle, le será más fácil agregar un poco de perfil / tarea para que se ejecute antes de que la aplicación se inicie.
- Si tienes que configurar todo en java, te sugiero que mires esta question
Actualización 2
Si la conexión a la base de datos local es necesaria solo para fines de desarrollo / depuración, configuraría todo usando el perfil de Maven. Las respuestas de esta pregunta resolverán eso.
Si necesita acceder a la base de datos H2 en producción (casi no puedo imaginar un caso de uso para eso) es mejor hacerlo en primavera. Principalmente porque es probable que la configuración del entorno / contenedor de la aplicación sea diferente en producción (en comparación con el entorno de desarrollo).
Para responder a la pregunta sobre si iniciar el servidor fuera del contexto de Spring o no, todo depende de los requisitos. Una cosa que debe tener en cuenta es que el servidor debe iniciarse antes de que se inicie el origen de datos (de lo contrario, el contexto de primavera no se cargará)
Actualización 3
Desafortunadamente, no puedo darle una solución que funcione, pero según los JavaDocs hay una diferencia entre el servidor TCP y el servidor web. Eche un vistazo más de cerca a la clase JavaDoc de servidor H2 .
Supongo que debería usar el método Server.createWebServer()
para crear el servidor (la diferencia entre el servidor TCP y el servidor web es que
Otra gran clase que podría usar org.h2.tools.Console
( org.h2.tools.Console
aquí ) Simplemente ejecute el método principal de la Consola y creo que eso debería resolverlo todo.