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

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

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

Ответ 1

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

  • Создайте сервлет "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);
        }
    }
    
  • В вашем web.xml добавьте загрузку свойства при запуске и установите значение 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).

Ответ 2

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

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