如何从java启动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

我有一个连接到H2的小应用程序,它使用hibernate做一些事情。我已经成功地使H2和Hibernate一起工作,但我的问题是我必须手动启动H2,这需要通过编程来完成。我试过好几种方法,但都不管用

用我最近试过的东西

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>