мне удалось сделать внедренный работу решение без AES, как это:
try {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:h2:" + getServletContext().getRealPath("/") +
"/WEB-INF/data/myDB", "sa", "");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM INFORMATION_SCHEMA.TABLES");
while (rs.next()) {
}
rs.close();
stmt.close();
conn.close();
} catch(SQLException e) {
} catch(ClassNotFoundException e) {
} finally {
}
Это было проверено с Н2 1.3.176 на Tomcat8. Он должен работать с H2 1.4 и CIPHER=AES
, если встроенная база данных уже находится в файле войны, я думаю.
Идея заключается в следующем: вам необходимо получить абсолютный путь, и этот путь развертывания может отличаться от того, как вы развернули военный файл.
Поэтому нам нужно использовать контекст сервлета и запросить реальный путь. Для этого мы используем getServletContext().getRealPath("/")
и добавим /WEB-INF/data/myDB
к нему в соответствии с вашими потребностями.
Я не тестировал часть CIPHER=AES
, поскольку я ее никогда не использовал.
Update:
Получение хорошей ссылки на контекст сервлета сложен. Можно использовать необработанный запрос, получить базовый сеанс, а затем перейти к контексту сервлета.
Но было бы хорошо, если бы встроенная база данных H2 открывалась, как только приложение было развернуто/запущено в Tomcat и закрыто правильно, как только приложение будет остановлено.
Для этого необходимо использовать прослушиватель. Вот что я предлагаю в качестве обновления моего предыдущего ответа. На этот раз решение в комплекте с AES CIPHER, и его легко подключить к вашему коду.
Предложение: Java-код слушателя может быть легко изменен для запуска сервера H2 tcp, который также полезен для включения автоматического смешанного режима (встроенный + tcp).
Добавить 3 строки в файл в Интернете.XML:
<listener>
<listener-class>com.mine.MyServletContextListener</listener-class>
</listener>
MyServletContextListener.java Файл:
package com.mine;
import javax.servlet.*;
import java.sql.*;
public class MyServletContextListener implements ServletContextListener {
Connection conn;
public void contextInitialized(ServletContextEvent sce) {
try {
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection("jdbc:h2:" + sce.getServletContext().getRealPath("/") + "/WEB-INF/data/myDB;CIPHER=AES", "sa", "aespassword dbpassword");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM INFORMATION_SCHEMA.TABLES");
while (rs.next()) {
}
rs.close();
stmt.close();
} catch(SQLException e) {
} catch(ClassNotFoundException e) {
} finally {
}
}
public void contextDestroyed(ServletContextEvent sce) {
try {
conn.close();
} catch(SQLException e) {
} finally {
}
}
}
В зависимости от того, какие приложения сервера вам нужно будет поддерживать, вы должны быть осторожны с введением файлов в webinf. Websphere очень разборчива в этой области. Вы пишете в базу данных или читаете? Лучше разрешить сохранение базы данных в отдельном каталоге и разрешить конфигурацию пути – Marged
Его доступность только для чтения и должна быть развернута только на Tomcat, предпочтительно в формате WAR. – Doug
Вам не разрешено писать файлы программы, попробуйте другой путь – Marged