Как мне запустить и продолжить запуск hsqldb в режиме сервера из моего веб-приложения? - PullRequest
10 голосов
/ 07 сентября 2010

Я не хочу использовать его во встроенном режиме, поскольку я могу разрешить другим внешним приложениям получать к нему доступ. И я хочу выполнить запуск сервера в то же время, когда Tomcat загружает мое приложение (или только когда tomcat запускается в этом отношении). Это сделано для того, чтобы мне не приходилось просить клиентов вручную запускать hsqldb с помощью команды или сценария, прежде чем они смогут поместить мою войну в tomcat и запустить ее (для простоты).

Возможно, я могу позвонить Server с главного сервера, отправив команду из Java, но это даст мне бесконечный поток, я не уверен, как с этим справиться. Есть ли более простой и проверенный способ сделать это?

Ответы [ 2 ]

9 голосов
/ 05 октября 2011

В соответствии с документацией HSQLDB возможен запуск базы данных из кода Java: http://hsqldb.org/doc/2.0/guide/listeners-chapt.html#listeners_appstart-sect. Таким образом, вы можете использовать сервлет для загрузки базы данных при запуске веб-приложения. Шаги должны быть следующими:

  1. Создайте сервлет "InitDatabase" и поместите код для запуска базы данных в метод init ()

    @Override
    public void init() throws ServletException {
        super.init();
        try {
            System.out.println("Starting Database");
            HsqlProperties p = new HsqlProperties();
            p.setProperty("server.database.0", "file:/opt/db/crm");
            p.setProperty("server.dbname.0", "mydb");
            p.setProperty("server.port", "9001");
            Server server = new Server();
            server.setProperties(p);
            server.setLogWriter(null); // can use custom writer
            server.setErrWriter(null); // can use custom writer
            server.start();
        } catch (AclFormatException afex) {
            throw new ServletException(afex);
        } catch (IOException ioex) {
            throw new ServletException(ioex);
        }
    }
    
  2. В вашем файле web.xml добавьте свойство load при запуске и установите его равным 1. Это для вызова метода init () при запуске веб-приложения.

    <servlet>
        <servlet-name>InitDatabase</servlet-name>
        <servlet-class>bo.hsqltest.InitDatabase</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet> 
    

После этого веб-приложение запустит HSQLDB в новом потоке. Для закрытия базы данных при остановке приложения вы можете переопределить метод destroy () InitServlet. В методе destroy вы должны выполнить команду "SHUTDOWN" как обычный SQL-запрос (через JDBC).

1 голос
/ 07 сентября 2010

Вы можете использовать HSQLDB на любом веб-сервере / сервере приложений во встроенном режиме и разрешить доступ к нему внешним приложениям, запустив org.hsqldb.server.Servlet на своем веб-сервере / сервере приложений.После этого внешние приложения будут подключаться к сервлету с помощью jdbc: hsqldb: http: type url's.

Если вы хотите запустить org.hsqldb.server.Server (класс версии 2.0) или org.hsqldb.Сервер, в качестве отдельного процесса, такого как Tomcat, вы можете использовать класс org.hsqldb.util.MainInvoker для вызова основного метода для нескольких классов (например, Tomcat и HSQLDB Server) с первым вызванным сервером.

...