Удаленное подключение к базе данных H2 в режиме сервера с пулом DBCP

Я пытаюсь создать встроенный сервер H2, к которому я также мог бы получить доступ удаленно, а также использовать Tomcat DBCP Pooling.

Вот мой код для создания источника данных:

@Produces @ApplicationScoped
public DataSource getDataSource() throws NamingException, SQLException {
    dataSource = new BasicDataSource();
    dataSource.setDriverClassName("org.h2.jdbcx.JdbcDataSource");
    dataSource.setUrl("jdbc:h2:/tmp/myapp");
    dataSource.setUsername("sa");
    dataSource.setPassword("");
    dataSource.setMaxActive(100);
    dataSource.setMaxIdle(30);
    dataSource.setMaxWait(10000);
    // start the pool
    Connection connection = dataSource.getConnection();
    // start the server
    server = Server.createTcpServer("-tcpAllowOthers").start();
    connection.close();
    return dataSource;
}

И когда я пытаюсь подключить его удаленно (например, с помощью H2 Browser (java -jar h2.jar -browser)) используя URL-адрес "jdbc:h2:tcp://192.168.2.58//tmp/myapp" (192.168.2.58 - это удаленный IP-адрес сервера), вот ошибка, которую я получаю:

Database may be already in use: "/tmp/myapp.mv.db". Possible solutions: close all other connection(s); use the server mode [90020-179] 90020/90020

У кого-нибудь есть решение?

2 ответа

Решение

Вот наконец код, который работал:

@ApplicationScoped
public class DataSourceProducer {

    private JdbcDataSource dataSource;
    private Server server;

    @Produces @ApplicationScoped
    public DataSource getDataSource() throws NamingException, SQLException {
        dataSource = new JdbcDataSource();
        dataSource.setUrl("jdbc:h2:/tmp/myapp");
        dataSource.setUser("sa");
        dataSource.setPassword("");
        // start the server
        server = Server.createTcpServer("-tcpAllowOthers").start();
        return dataSource;
    }

    public void disposeDataSource(@Disposes DataSource dataSource) throws SQLException {
        server.stop();
    }
}

И тогда я могу получить к нему доступ с помощью URL jdbc:h2:tcp://<remote ip>//tmp/myapp (по крайней мере я заставил его работать через SSH туннелирование порта 9020 и получить к нему доступ jdbc:h2:tcp://localhost//tmp/myapp)

Проверьте H2 Несколько соединений. Вам нужен режим клиент / сервер, чтобы иметь возможность открывать базу данных несколько раз. По умолчанию встроенные базы данных не могут быть открыты несколько раз. Вам необходимо использовать функцию "автоматический смешанный режим":

Смешанный режим для базы данных H2

Поэтому, если вы измените свой URL-адрес jdbc следующим образом, он должен работать:

JDBC:h2:/ TMP / MyApp;AUTO_SERVER=TRUE,

Другие вопросы по тегам