H2 в памяти, создавая сервер для доступа через Shell - PullRequest
0 голосов
/ 08 ноября 2018

Я использую DataSourceFactory dropwizard и H2, чтобы создать базу данных в памяти для тестирования. Вот что у меня есть

private static final String DBNAME = String.format("JDBITest-%d", System.currentTimeMillis());

protected final DataSourceFactory config = new DataSourceFactory();
{
    final String url = String.format("jdbc:h2:mem:%s;", DBNAME) +
                       "MODE=MySQL;" +
                       "TRACE_LEVEL_FILE=3;" +
                       "DB_CLOSE_DELAY=-1;" +
                       "IGNORECASE=TRUE";
    System.out.println("Creating in memory H2 using " + url);

    BootstrapLogging.bootstrap();
    config.setUrl(url);
    config.setUser("sa");
    config.setDriverClass("org.h2.Driver");
    config.setValidationQuery("SELECT 1");
}

@Before
public void setUp() throws Exception {
    Server server = Server.createTcpServer().start(); // (4)
    System.out.println("Server started and connection is open.");
    System.out.println("URL: jdbc:h2:" + server.getURL() + "/mem:" + DBNAME);
}

Когда это работает, я вижу

Creating in memory H2 using jdbc:h2:mem:JDBITest-1541641621470;MODE=MySQL;TRACE_LEVEL_FILE=3;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE
Server started and connection is open.
URL: jdbc:h2:tcp://0.0.17.56:9092/mem:JDBITest-1541641621470

Почему TCP 0.0.17.56? Я не могу получить к нему доступ и не могу использовать H2.jar для доступа к оболочке.

1 Ответ

0 голосов
/ 08 ноября 2018

Здесь есть несколько неправильных вещей.

H2 имеет различные режимы подключения. В вашем примере вы конфигурируете DataSourceFactory для в памяти соединение, но затем в методе @Before вы создаете новый экземпляр H2 с tcp на основе соединения. Подробнее о режимах подключения здесь .

Так что теперь у вас есть в основном 2 экземпляра H2 , в памяти и tcp, и они совершенно не связаны. Поэтому вам, вероятно, нужно настроить только один тип подключения для ваших тестов.

Если вы хотите подключиться к H2 дБ за пределами JVM (например, из браузера) - тогда вам необходимо установить соединение на основе tcp.

Чтобы иметь возможность подключиться к БД из браузера, вам также необходимо запустить консольное приложение. Который должен быть внутри h2.jar с такой командой java -jar h2*.jar. Подробнее об этом здесь .

И, наконец, вам подходит этот код (с подключением к памяти):

private static final String DBNAME = String.format("JDBITest-%d", System.currentTimeMillis());
private ManagedDataSource dataSource;

@Before
public void setUp() {
    System.out.println("Server started and connection is open.");

    final String url = String.format("jdbc:h2:mem:%s;", DBNAME) +
            "MODE=MySQL;" +
            "TRACE_LEVEL_FILE=3;" +
            "DB_CLOSE_DELAY=-1;" +
            "IGNORECASE=TRUE";
    System.out.println("Creating in memory H2 using " + url);

    DataSourceFactory config = new DataSourceFactory();
    BootstrapLogging.bootstrap();
    config.setUrl(url);
    config.setUser("sa");
    config.setDriverClass("org.h2.Driver");
    config.setValidationQuery("SELECT 1");

    dataSource = config.build(null, "test");
}

@Test
public void test() throws SQLException {
    Connection connection = dataSource.getConnection();

    connection.createStatement().executeUpdate("CREATE TABLE TEST (`id` INT)");
    connection.createStatement().executeUpdate("INSERT INTO TEST (`id`) VALUES (1)");
    ResultSet resultSet1 = connection.createStatement().executeQuery("SELECT * FROM TEST WHERE `id` = 1");
    resultSet1.next();
    resultSet1.getInt(1);

    System.out.println("Found ID: " + resultSet1.getInt(1));
}

Из:

Server started and connection is open.
Creating in memory H2 using jdbc:h2:mem:JDBITest-1541649996267;MODE=MySQL;TRACE_LEVEL_FILE=3;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE
Found ID: 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...