2013-03-26 28 views
2

У меня есть проект Eclipse, которая организована следующим образом:Как читать/записывать H2 встроенную БД в файл внутри вашего JAR?

MyProj/ 
    src/ 
     main/ 
      java/ 
       <All main Java source here> 
      config/ 
       spring/ 
        spring-config.xml 
       views/ 
        <All JSPs here> 
       h2/ 
        my-h2-db 
     test/ 
      java/ 
      config/ } etc. for test sources 

Когда я завязывайте его в WAR, он упакован так:

MyProj.war 
    META-INF/ 
    WEB-INF/ 
     web.xml 
     lib/ 
     classes/ 
      spring-config.xml 
      my-h2-db 
      views/ 
       Home.jsp 
       About.jsp 
       etc. 
      com/ --> root dir for all compiled Java binaries 

Мне нужно написать код, который способен CRUDing базы данных H2 (и всех таблиц, пользователей и т. Д., Которые идут с ней), что для этого примера я вызвал my-h2-db. Таким образом, приложение может работать с одним и тем же файлом БД независимо от того, тестирую ли я изнутри Eclipse или если я использую развернутую WAR.

Так я спрашиваю:

  • Как получить доступ к файлу my-h2-db как с Eclipse, и во время выполнения (WAR) классов, так как он упакован в другом месте, чем где он живет в проекте Eclipse, ?; и

ответ

3

Я не думаю, что вы захотите упаковать H2-файлы в своем приложении WAR. Он не сможет использовать их в WAR.

Что вы хотите в своем управлении версиями - это DDL, используемый для создания объектов базы данных (и предварительно заполняет, если необходимо). Затем, в вашей среде разработки или производства, вы используете эти сценарии для создания/обновления базы данных.

Что вы имеете в своем веб-приложении - это просто URL-адрес JDBC (указывающий расположение файла базы данных), используемый для поиска встроенной базы данных. Как вы предположили, это будет отличаться в зависимости от среды разработки или производства.

Я использую LiquiBase как способ управления созданием/обновлением базы данных, и он довольно прост в использовании.

Однако идея создания базы данных как части разработки и последующего встраивания этих файлов в WAR для их непосредственного использования не будет работать. Нет никакой концепции сохранения этих файлов, поэтому ни одна из данных не будет сохраняться.

+0

Спасибо @ Edh (+1) - однако я немного запутался здесь! Вы говорите, что как только я упакую свой проект в WAR, он не может подключиться к базе данных H2 (встроенной), которая находится внутри самой WAR? Разве это не означает, что должна быть база данных ** ** embedded **? Или ты говоришь что-то еще? Еще раз спасибо! – IAmYourFaja

+2

Нет, встроенная база данных - это то, где код, содержащий базу данных, запускается в пределах одной JVM как клиенты jdbc. Это не означает, что файлы, используемые встроенными базами данных, хранятся в самом JAR. Для большинства встроенных баз данных они по-прежнему используют файлы в файловой системе для сохранения данных. В противном случае ни одна из данных не будет сохраняться при выполнении JVM. – EdH

+0

Ahh, * старт * чтобы иметь смысл. Три быстрых наблюдения: (1) Когда вы говорите: «Встроенная база данных - это где код, в котором находится база данных, работает в одной JVM как клиенты jdbc ... *« Меня смущает «код, в котором размещаются базы данных» и «jdbc клиенты». Можете ли вы дать мне конкретный пример обоих этих объектов? (2) Итак, чтобы подтвердить: мне еще нужно «установить» файл базы данных H2 по некоторым URL-адресам, чтобы моя WAR могла получить к нему доступ через прогоны? (3) Как это отличается от обычной RDBMS, такой как MySQL? Еще раз спасибо за помощь! – IAmYourFaja