最近我加入了一个新的团队,这里的人们使用h2进行存根服务.
我想知道我是否可以使用Web界面显示此数据库的内容.在工作中,它可以去localhost:5080
我有一个使用h2数据库的项目,但是当我点击时我看不到h2 web控制台 localhost:5080
我也试过localhost:8082- 它也行不通.
我的项目配置(成功运行):
<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"/>
Run Code Online (Sandbox Code Playgroud)
我没有想法如何访问h2 web控制台.请帮忙.
我只在.m2文件夹中看到提到h2 …
当我尝试向db"INSERT INTO invite_users VALUES('id',user_name')添加新行时"
我收到这个错误:
General error: "java.lang.IllegalStateException: Chunk 2089 no longer exists [1.4.181/9]"
Run Code Online (Sandbox Code Playgroud)
可能这是db的一些问题,因为当我试图将相同的行添加到新的db时 - 错误消失了.
2014年11月20日更新
好消息!我联系了H2 db的开发人员并发现他们将在下一个版本中修复该bug. https://groups.google.com/forum/#!topic/h2-database/i_GHXExjotc
2014年12月6日更新
一个简单的解决方法是通过将"; mv_store = false"附加到数据库URL来禁用MVStore.
但是,如果你需要旧的数据库,这个技巧将不起作用.它创建了新的数据库,扩展名为.h2.db而不是.mv.db
要解决此问题,您需要创建旧数据库".mv.db"的SQL脚本(使用"恢复"工具),然后使用"runscript ..."运行此脚本.
我试图从h2 db获取值,但总是得到这个错误
org.h2.jdbc.JdbcSQLException: No data is available [2000-171]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:169)
at org.h2.message.DbException.get(DbException.java:146)
at org.h2.message.DbException.get(DbException.java:135)
at org.h2.jdbc.JdbcResultSet.checkOnValidRow(JdbcResultSet.java:2956)
at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:2962)
at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:306)
Run Code Online (Sandbox Code Playgroud)
我用Google搜索了一个答案
一定要调用rs.next(); 在使用任何getter方法之前.
但我确实叫rs.next()......
这是我的代码:
public User getUser(int userId) throws SQLException {
User u = new User(userId);
try {
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM invited_users WHERE user_id=" + userId);
rs.next();
u.setName(rs.getString("user_name"));
} catch (SQLException except) {
JOptionPane.showMessageDialog(null, "Unable to load user! " + except);
}
return u;
}
Run Code Online (Sandbox Code Playgroud) application.properties 中使用的属性
server.port=8085
spring.datasource.url=jdbc:h2:~/test spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.h2.console.enabled=true
spring.h2.console.path=/h2
Run Code Online (Sandbox Code Playgroud)
h2数据库和springboot中的错误如何解决错误的用户名和密码错误?
org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200]
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200]
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200]
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200]
at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200]
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na]
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na]
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na]
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) [HikariCP-3.4.5.jar:na]
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) [HikariCP-3.4.5.jar:na]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) [HikariCP-3.4.5.jar:na]
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) [HikariCP-3.4.5.jar:na] …Run Code Online (Sandbox Code Playgroud) 我正在使用JBoss AS 7和H2数据库.我有一个独立的应用程序,试图像这样连接到这个数据库.
我的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="Test">
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:test</property>
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<mapping class="Kunde" resource="Kunde.hbm.xml"/>
<mapping class="Mitarbeiter" resource="Mitarbeiter.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
我的映射文件是:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Oct 26, 2012 7:34:15 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="Kunde" table="KUNDE">
<id name="id" type="long">
<column name="ID" />
<generator class="assigned" />
</id>
<property name="vorname" type="java.lang.String">
<column name="VORNAME" />
</property>
<property name="nachname" type="java.lang.String">
<column …Run Code Online (Sandbox Code Playgroud) 我最近将我的springboot项目中的h2数据库更新到2.1.210。
这引发了一些问题,其中大部分我都能自己解决。我无法解决的问题是在数据库中保存大文件。
当我尝试上传 ~3,5MB 文件时,出现以下错误:
org.h2.jdbc.JdbcSQLDataException:
Value too long for column "BINARY VARYING": "504b03040a00000000008a6bd150e8d6354d8303010083030100070000003030302e706e6789504e... (3648495)" [22001-210]
Run Code Online (Sandbox Code Playgroud)
在 h2 1.4.200 上完美运行的注释如下所示
@Lob
@Type( type = "binary" )
@Column(name = "ZIP", columnDefinition="BLOB")
private byte[] zip;
Run Code Online (Sandbox Code Playgroud)
我不知道它是否相关,但我在使用时也遇到错误
@Type( type = "text" )
Run Code Online (Sandbox Code Playgroud)
这里的错误是
Precision ("2147483647") must be between "1" and "1048576" inclusive
Run Code Online (Sandbox Code Playgroud)
因为每当我使用“文本”时,它就会被翻译为varchar(2147483647)
我想在 spring boot+ JPA 中执行单元测试。为此,我创建了配置文件来为 dataSource、所有 hibernate 属性、entityManagerFactory 和 transactionManager 创建 bean。一切都很完美。表是由模型类创建的。但现在我想通过data.sql文件在数据库的所有表中插入数据进行测试。我将 data.sql 文件保留在 src/main/resources 中,但它没有加载该文件。那么在开始单元测试之前如何在 h2 数据库中加载数据。
这是我的配置文件 -
import java.util.Properties;
import javax.sql.DataSource;
import org.hibernate.cfg.Environment;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableJpaRepositories(basePackages = "base_package_name")
@EnableTransactionManagement
public class JPAConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1");
/*dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:mem:testdb");*/
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
} …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用不同MySQL模式进行客户管理的项目,eG每个客户都有自己的数据库模式,该模式是使用骨架模板创建的.
对于兼容性问题,我必须从Java创建新的MySQL模式,这是在PHP之前完成的.我创建了一个小型服务类,它通过重复使用在MySQL数据库上完美地CREATE TABLE 'a' LIKE 'b';工作,但是这不适用于H2db,因为H2 LIKE在创建表时不支持-part.然后我创建了一个MySQL并修改了该文件,以便用Java(Files.readAllLines可以输入Statement.executeBatch)轻松处理.但是,由于语句如此,此转储在H2db上也会失败COLLATION=UTF8.遗憾的是,这些都很重要,因为我们经常需要特殊的字符,需要正确编码,所以不建议简单地从sql文件中删除所述语句.
我像这样初始化DataSource:
public DataSource dataSource(ResourceLoader resourceLoader) {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.setScriptEncoding("UTF-8")
.addScript("data.sql").build();
}
Run Code Online (Sandbox Code Playgroud)
所以,我的配置可能性很少.我们gradle用来构建我们的应用程序,所以建议的maven-plugin也无济于事 - 至少我还没有找到使用它gradle,如果可能的话.
所以我的问题在于,我需要检查服务是否真正保持数据正确,但我无法在内存中执行,因为H2不支持语法,我不允许使用"真正的"MySQL数据库,因为我们所有的测试都必须与"真实"连接分离,并且必要时只能使用数据库的内存存储.
我已经在springBoot应用程序中添加了H2DB以进行单元测试。
我在application-test.properties中添加了:
spring.datasource.name = h2db
spring.h2.console.enabled = true
它的工作正常,保存值。
但是它是如何工作的以及如何浏览该数据库?
我正在尝试在使用休眠时创建一个小的 H2 内存数据库。但该表未显示在 H2 UI 中。我不确定是否需要在配置中包含其他任何内容。
这是代码: 下面是为 hibernate 和 h2 DB 添加的依赖项。
pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.1.Final</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
<version>1.4.200</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是包含所有 H2 DB 详细信息的配置 XML。
休眠文件.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 5.3//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-5.3.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">org.h2.Driver</property>
<property name="connection.url">jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</property>
<property name="dialect">org.hibernate.dialect.H2Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping class="HiberDemo.Employee"/>
</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
这将与其他列一起创建表。
雇员.java
package HiberDemo;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name= "emp500")
public class Employee {
@Id
private int id;
private …Run Code Online (Sandbox Code Playgroud) 最近,我们的团队提出了一个问题:如果生产环境依赖于不同的数据库引擎(在我们的例子中为 MySQL8),则使用 h2db 进行集成测试是否是一种不好的做法/应该避免。
\n考虑到我们在后端使用 spring boot/hibernate,我不确定我是否同意这一点。
\n我做了一些阅读并发现这篇文章https://phauer.com/2017/dont-use-in-memory-databases-tests-h2/基本上说明了以下内容(以及更多内容):
\n\n\n长话短说
\n使用内存数据库进行测试会降低测试的可靠性和\n范围。尽管基于 h2 的测试是绿色的,但您的应用程序\xe2\x80\x99s SQL 在生产环境中\n可能会针对真实数据库失败。
\n
\n\n它们提供与真实数据库不同的功能。可能的\n后果是:
\n\n
\n- 您更改应用程序\xe2\x80\x99s SQL 代码只是为了使\nit 在真实数据库和内存数据库中运行。这可能会导致实施效率较低、优雅、准确或可维护性较差。或者\n你根本无法\xe2\x80\x99 做某些事情。
\n- 您完全跳过某些\n功能的测试。
\n
据我所知,对于具有一些业务逻辑的简单 CRUD 应用程序,所有这些点都与我有关(本文中还有更多内容),因为 hibernate 包装了所有 SQL 并且代码中没有本机 SQL。
\n有没有我忽略或没有考虑到的反对 h2db 的观点?关于使用内存数据库与 Spring Boot/Hibernate 进行集成测试是否有“最佳实践”?
\n我使用 Keycloak 15.0.2 和默认的 H2 数据库。我已经登录了多个用户,并且可以在 Keycloak 会话选项卡中获取活动会话,但在数据库中,我看不到与 USER_SESSION 和 CLIENT_SESSION 等会话相关的所有表中的任何条目。
有人对我如何获得这些条目有任何建议吗?
提前致谢。
我正在开发一个使用 H2 数据库的应用程序。过去使用此技术没有问题,但是在下载 h2 数据库的新副本并运行 jar 时,我无法使用默认设置登录!我正在跑步h2-1.4.200.jar并受到以下欢迎:
General error: "java.lang.IllegalStateException: Unable to read the page at position 2199023614787 [1.4.200/6]" [50000-200] HY000/50000 (Help)
Run Code Online (Sandbox Code Playgroud)
我试图运行默认设置只是为了连接到数据库,但似乎没有任何效果。我已经尝试了以下但没有运气,以及 github 等上的一些其他来源:
嵌入式 H2 数据库“NonTransientError: Unable to read the page at position”错误?
我在我的项目中使用以下依赖项:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
并下载相应版本的H2数据库—— 1.4.200
过去有没有其他人在 H2 数据库上遇到过这样的问题?我收到的错误如下图所示:
H2 数据库控制台错误 1:


任何帮助将不胜感激,我还尝试在我的 maven 依赖项和运行的 h2 版本中降级到 1.4.190 版本 - h2-1.4.190!