2010-09-07 4 views
10

Tôi không muốn sử dụng nó ở chế độ nhúng vì tôi có thể cho phép các ứng dụng bên ngoài khác truy cập vào nó. Và tôi muốn thực hiện khởi động của máy chủ cùng lúc với Tomcat tải ứng dụng của tôi (hoặc chỉ khi tomcat chạy cho vấn đề đó). Điều này là để tôi không phải yêu cầu khách hàng tự chạy hsqldb với một lệnh hoặc kịch bản trước khi họ có thể đặt chiến tranh của tôi vào tomcat và chạy nó (để giữ cho mọi thứ đơn giản).Làm cách nào để bắt đầu và tiếp tục chạy hsqldb ở chế độ máy chủ từ trong ứng dụng web của tôi?

Tôi có thể gọi Server từ chính bằng cách gửi lệnh từ Java, nhưng điều này sẽ cho tôi một chuỗi không giới hạn, tôi không chắc chắn cách xử lý. Có cách nào được kiểm tra dễ dàng hơn để thực hiện việc này không?

Trả lời

9

Theo tài liệu HSQLDB có thể bắt đầu cơ sở dữ liệu từ mã Java: http://hsqldb.org/doc/2.0/guide/listeners-chapt.html#listeners_appstart-sect. Vì vậy, bạn có thể sử dụng một servlet để tải cơ sở dữ liệu khi ứng dụng web đang bắt đầu. Các bước nên như sau:

  1. Tạo một Servlet "InitDatabase" và đặt mã cho khởi động cơ sở dữ liệu trên init phương pháp()

    @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. Trong web.xml của bạn thêm tài sản nạp khi khởi động và đặt nó thành 1. Điều này cho lời gọi đến phương thức init() khi Ứng dụng Web bắt đầu.

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

Sau khi làm được điều này các ứng dụng Web sẽ bắt đầu HSQLDB trong một chủ đề mới. Để tắt cơ sở dữ liệu khi ứng dụng dừng lại, bạn có thể ghi đè lên phương thức destroy() của InitServlet. Trong phương thức hủy, bạn phải thực hiện lệnh "SHUTDOWN" như truy vấn sql bình thường (thông qua JDBC).

1

Bạn có thể sử dụng HSQLDB trên bất kỳ máy chủ web/ứng dụng nào ở chế độ được nhúng và cho phép các ứng dụng bên ngoài truy cập nó bằng cách chạy org.hsqldb.server.Servlet trên máy chủ web/ứng dụng của bạn. Các ứng dụng bên ngoài sau đó sẽ kết nối với servlet bằng cách sử dụng jdbc: hsqldb: http: type url's.

Nếu bạn muốn chạy org.hsqldb.server.Server (lớp phiên bản 2.0) hoặc org.hsqldb.Server, như một quá trình riêng biệt với Tomcat, bạn có thể sử dụng lớp org.hsqldb.util.MainInvoker để gọi phương thức chính cho nhiều lớp (ví dụ: Tomcat và HSQLDB Server) với Máy chủ được gọi là đầu tiên.