Удаленное подключение к базе данных 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,