如何从java启动H2
我有一个连接到H2的小应用程序,它使用hibernate做一些事情。我已经成功地使H2和Hibernate一起工作,但我的问题是我必须手动启动H2,这需要通过编程来完成。我试过好几种方法,但都不管用 用我最近试过的东西如何从java启动H2,java,xml,hibernate,h2,Java,Xml,Hibernate,H2,我有一个连接到H2的小应用程序,它使用hibernate做一些事情。我已经成功地使H2和Hibernate一起工作,但我的问题是我必须手动启动H2,这需要通过编程来完成。我试过好几种方法,但都不管用 用我最近试过的东西 server = Server.createTcpServer("-tcpAllowOthers").start(); 我得到一个例外: java.lang.ExceptionInInitializerError at com.runtimeload.Hibernate
server = Server.createTcpServer("-tcpAllowOthers").start();
我得到一个例外:
java.lang.ExceptionInInitializerError
at com.runtimeload.HibernateUtil.startH2AndBuildSessionFactory(HibernateUtil.java:26)
at com.runtimeload.HibernateUtil.<clinit>(HibernateUtil.java:12)
at com.runtimedataload.RuntimeDataLoadTest.<init>(RuntimeDataLoadTest.java:30)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect
at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator$1$1.convert(BasicConnectionCreator.java:122)
at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:140)
at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:58)
at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:75)
at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:106)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930)
at com.wkfsfrc.drools.dummy.runtimeload.HibernateUtil.startH2AndBuildSessionFactory(HibernateUtil.java:21)
... 27 more
Caused by: org.h2.jdbc.JdbcSQLException: Wrong user name or password [28000-178]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
at org.h2.message.DbException.get(DbException.java:178)
at org.h2.message.DbException.get(DbException.java:154)
at org.h2.message.DbException.get(DbException.java:143)
at org.h2.engine.Engine.validateUserAndPassword(Engine.java:316)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:150)
at org.h2.engine.Engine.createSession(Engine.java:125)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:150)
at java.lang.Thread.run(Thread.java:745)
RuntimeDataLoadTest.java
package com.runtimedataload;
import com.KieSessionFactory;
import com.SessionIDs;
import com.runtimeload.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import java.net.URISyntaxException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class RuntimeDataLoadTest {
SessionFactory sf = HibernateUtil.getSessionFactory();
private Connection conn;
@Before
public void createEnv() throws Exception{
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test", "sa", "sa");
Statement stat = conn.createStatement();
stat.execute("drop table EMPLOYEE");
stat.execute("create table EMPLOYEE(id int primary key, firstname varchar(255), lastname varchar(255), cellphone varchar(255));");
stat.execute("insert into EMPLOYEE values(3, 'aurel', 'ln', 'cp')");
}
...
}
不要介意测试方法,做和提取口水
谢谢 在我的测试用例中对我有用:
JdbcDataSource ds = new JdbcDataSource();
ds.setURL("jdbc:h2:mem:test;MODE=Oracle");
ds.setUser("sa");
ds.setPassword("sa");
RunScript.execute(ds.getConnection(), new FileReader("schema.sql"));
Server server = Server.createWebServer("-webAllowOthers");
server.start();
希望有帮助。最终我用一个maven插件启动了H2服务器。下面您将找到源代码:
<plugin>
<groupId>com.btmatthews.maven.plugins.inmemdb</groupId>
<artifactId>inmemdb-maven-plugin</artifactId>
<configuration>
<skip>${skip.unit.tests}</skip>
<monitorPort>11527</monitorPort>
<monitorKey>myKey</monitorKey>
<daemon>true</daemon>
<type>h2</type>
<database>${connection.database}</database>
<username>${connection.username}</username>
<password>${connection.password}</password>
</configuration>
<executions>
<execution>
<id>startH2Server</id>
<goals>
<goal>run</goal>
</goals>
<phase>process-test-classes</phase>
</execution>
<execution>
<id>stopH2Server</id>
<goals>
<goal>stop</goal>
</goals>
<phase>prepare-package</phase>
</execution>
</executions>
</plugin>
com.btmatthews.maven.plugins.inmemdb
inmemdb maven插件
${skip.unit.tests}
11527
我的钥匙
真的
氢
${connection.database}
${connection.username}
${connection.password}
Starth2服务器
跑
过程测试类
停止服务器
停止
准备包装
顺便说一句,我需要h2用于测试目的
需要将连接url更改为:
<property name="connection.url">jdbc:h2:tcp://localhost:9092/mem:test</property>
jdbc:h2:tcp://localhost:9092/mem:test
其他属性保持不变
希望这能帮助别人。干杯 “原因:org.h2.jdbc.JdbcSQLException:用户名或密码错误[28000-178]”对我来说似乎很清楚!嗯,这不应该很清楚,因为,正如我所说,当我手动启动H2时,我使用相同的连接,并且工作正常:)默认设置是用户名“sa”,没有(空字符串)密码。你确定你也应该使用密码“sa”吗?是的,当我在jar中运行main方法(或双击jar)启动H2时,会弹出一个网页,我只能使用“sa”和“sa”登录。是的,很好,但是你真的尝试过使用代码中的空密码吗?你的问题没有现成的答案,所以这实际上是一个排除可能性的过程。谢谢你的回答,但我不明白前5行代码的要点。。。使用最后两行对我没有帮助。。。那么,如果还没有启动服务器,那么创建ds然后创建模式的意义是什么呢?
<plugin>
<groupId>com.btmatthews.maven.plugins.inmemdb</groupId>
<artifactId>inmemdb-maven-plugin</artifactId>
<configuration>
<skip>${skip.unit.tests}</skip>
<monitorPort>11527</monitorPort>
<monitorKey>myKey</monitorKey>
<daemon>true</daemon>
<type>h2</type>
<database>${connection.database}</database>
<username>${connection.username}</username>
<password>${connection.password}</password>
</configuration>
<executions>
<execution>
<id>startH2Server</id>
<goals>
<goal>run</goal>
</goals>
<phase>process-test-classes</phase>
</execution>
<execution>
<id>stopH2Server</id>
<goals>
<goal>stop</goal>
</goals>
<phase>prepare-package</phase>
</execution>
</executions>
</plugin>
<property name="connection.url">jdbc:h2:tcp://localhost:9092/mem:test</property>