descargar datos java spring orm h2 h2db

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.

Ver modo mixto automático

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.