Как я могу подключиться к файлу базы данных H2 только для чтения, который находится внутри работающей банки?

Мне нужно создать базу данных один раз с помощью операторов create / insert, а затем сделать ее доступной внутри javafx runnable jar с доступом к базе данных только чтение.

Я просто много раз просматривал документ базы данных H2 и пытался добиться этого с помощью H2 Driver version 1.4.196 and 1.4.192, но я думаю, что что-то упустил.

Я могу подключиться, не включая его в работающую банку, и все, что угодно, тоже работает. Но мне нужно получить к нему доступ из самого jar, чтобы предотвратить доступ к БД от посторонних.

Могу ли я подключить строку или логику подключения для подключения файла БД только для чтения из самого jar?

Конечно, мне нужен более четкий практический пример из это, это и это.

Я реализовал логику архивирования как это, и она отлично работает с заданным путем.

Но когда я добавил zip-файл в runnable jar и получил доступ к нему через следующий код:

DriverManager.getConnection("jdbc:h2:file:split:zip:./test.zip!/test");

Затем он выдает исключение с:

Exception in thread "main" org.h2.jdbc.JdbcSQLException: IO Exception: "java.io.FileNotFoundException: .\jar\res\buzdirectory.zip (The system cannot find the path specified)"; "listFiles zip:./jar/res/buzdirectory.zip!/" [90031-196]

Если я поставлю полностью квалифицированный путь, он будет работать хорошо:

DriverManager.getConnection("jdbc:h2:file:split:zip:C:\\CoreJava\\src\\main\\java\\res\\test.zip!/test");

То, что мне здесь не хватает, чтобы получить доступ к нему из файла jar.

Где хранится ZIP-файл? Похоже, вы ссылаетесь на несуществующий файл

MadProgrammer 18.03.2018 22:00

На самом деле путь к zip-файлу идеален и существует, но я думаю, что напортачил с созданием файла. Могу я сделать то же самое?

Gopal00005 18.03.2018 22:16

А в zip файле содержится база данных? Похоже, вы ставите лошадь впереди телеги (но я могу неправильно понять, где вы собираетесь). Очевидно, вам нужно создать базу данных, заполнить ее данными перед ее архивированием.

MadProgrammer 18.03.2018 22:18

Да, он содержит файл базы данных с именем test.mv.db, созданный службой подключения netbeans и выполняющий операторы create / insert перед его заархивированием с помощью 7z.

Gopal00005 18.03.2018 22:29

Хммм, а H2 поддерживает 7z? Вы пробовали более традиционный архиватор ZIP или даже банку (которая просто использует ZIP)?

MadProgrammer 18.03.2018 22:38

Если ваш файл базы данных находится в ваших ресурсах, попробуйте заменить ~ на.

Menai Ala Eddine - Aladdin 20.03.2018 00:58

Знак ~ предназначен для каталога пользователя по умолчанию, см. Это: h2database.com/html/tutorial.html#console_settings

Gopal00005 20.03.2018 09:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
1 261
1

Ответы 1

I считать мы не можем открыть файл базы данных непосредственно из исполняемого файла JAR. Для доступа к нему должен быть «настоящий» файл, поэтому нам нужно будет извлечь его из JAR, а затем открыть эту копию.

Например, чтобы извлечь базу данных из JAR во временный файл:

File dbFile = File.createTempFile("temp", ".zip");
dbFile.deleteOnExit();

java.nio.file.Files.copy(this.getClass().getResourceAsStream("/db/temp.zip"), 
        dbFile.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);

StringBuffer connStr = new StringBuffer("jdbc:h2:file:split:zip:")
        .append(dbFile.getAbsolutePath()).append("!/temp");

Connection conn = DriverManager.getConnection(connStr.toString());
conn.close();
System.out.println("closed");

Между прочим, это пока не для всех. Но мы можем использовать такой подход в некоторых особых случаях.

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