Статьи

Встраивание экземпляра сервера HSQLDB в Spring

Я с радостью использовал XAMPP для разработки, пока мне не пришлось разместить его где-нибудь в Интернете, чтобы клиент мог его протестировать и использовать. У меня есть VPS, который имеет только 384 ОЗУ, и мне нужно быстро найти способ, я решил установить XAMPP в VPS. Из-за нехватки ОЗУ во время работы MySQL не удалось запустить Tomcat, хотя начальный размер кучи Java был установлен равным 64 м. Мне удалось временно разместить сайт в Jelastic, прежде чем перейти на OpenShift.

Я поиграл в идею объединения экземпляров базы данных и сервера приложений в 1 JVM, чтобы уменьшить использование оперативной памяти (по сравнению с MySQL + Tomcat). После поиска в Интернете я наткнулся на несколько статей по запуску экземпляров сервера HSQL вместе с Tomcat. Без сомнения, мне нужно сначала обновить свой сайт, чтобы он был совместим с HSQL, но в качестве попытки POC (проверки концепции) я решил изучить возможность запуска экземпляра сервера HSQL в контейнере Spring.

Есть несколько причин для запуска сервера HSQL, как bean-компонент в Spring:

1. Универсальная конфигурация. Все, что нужно для настройки, делается весной. В сети есть примеры запуска экземпляра HSQL вместе с Tomcat, но для этого нужно добавить материал в Tomcat (см. Ссылки ниже).

2. Независимость сервера приложений. «Теоретически» (в кавычках, поскольку я успешно проверил это только в Tomcat), поскольку все делается в Spring, нет нужды или мало что нужно настроить в appserver.

Серверный компонент HSQL «bean» также предназначен для запуска экземпляра в сетевом режиме (не в процессе, например, mem или file). Некоторые причины для этого:

1. Внутрипроцессный доступ к mem является самым быстрым, но не постоянным. Существуют и другие способы инициирования источника данных mem с использованием тегов Spring-jdbc Spring, что является лучшим подходом.

2. Внутрипроцессный доступ к «файлу» постоянен, но, как и к «mem», доступ к нему возможен только в рамках процесса Java.

3. Сетевой режим (hsql) является постоянным и доступным с помощью внешних клиентских инструментов JDBC. Это полезно для устранения неполадок и проверки.

После прочтения документации HSQLDB вот код, который управляет жизненным циклом bean-компонента экземпляра HSQL-сервера:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package org.gizmo.hsql.spring;
 
import java.io.IOException;
import java.util.Properties;
 
import org.hsqldb.Server;
import org.hsqldb.persist.HsqlProperties;
import org.hsqldb.server.ServerAcl.AclFormatException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.SmartLifecycle;
 
public class HyperSqlDbServer implements SmartLifecycle
{
 private final Logger logger = LoggerFactory.getLogger(HyperSqlDbServer.class);
 private HsqlProperties properties;
 private Server server;
 private boolean running = false;
 
 public HyperSqlDbServer(Properties props)
 {
  properties = new HsqlProperties(props);
 }
 
 @Override
 public boolean isRunning()
 {
  if(server != null)
   server.checkRunning(running);
  return running;
 }
 
 @Override
 public void start()
 {
  if(server == null)
  {
   logger.info('Starting HSQL server...');
   server = new Server();
   try
   {
    server.setProperties(properties);
    server.start();
    running = true;
   }
   catch(AclFormatException afe)
   {
    logger.error('Error starting HSQL server.', afe);
   }
   catch (IOException e)
   {
    logger.error('Error starting HSQL server.', e);
   }
  }
 }
 
 @Override
 public void stop()
 {
  logger.info('Stopping HSQL server...');
  if(server != null)
  {
   server.stop();
   running = false;
  }
 }
 
 @Override
 public int getPhase()
 {
  return 0;
 }
 
 @Override
 public boolean isAutoStartup()
 {
  return true;
 }
 
 @Override
 public void stop(Runnable runnable)
 {
  stop();
  runnable.run();
 }
}

Сокращенная конфигурация Spring:

1
2
3
4
server.database.0=file:d:/hsqldb/demobase
server.dbname.0=demobase
server.remote_open=true
hsqldb.reconfig_logging=false

Пример вывода при запуске Spring в Tomcat:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
[Server@1e893ae]: [Thread[pool-2-thread-1,5,main]]: checkRunning(false) entered
[Server@1e893ae]: [Thread[pool-2-thread-1,5,main]]: checkRunning(false) exited
[Server@1e893ae]: Initiating startup sequence...
[Server@1e893ae]: Server socket opened successfully in 7 ms.
Sep 27, 2012 9:26:23 AM org.hsqldb.persist.Logger logInfoEvent
INFO: checkpointClose start
Sep 27, 2012 9:26:23 AM org.hsqldb.persist.Logger logInfoEvent
INFO: checkpointClose end
[Server@1e893ae]: Database [index=0, id=0, db=file:d:/hsqldb/demo
base, alias=demobase] opened sucessfully in 442 ms.
[Server@1e893ae]: Startup sequence completed in 451 ms.
[Server@1e893ae]: 2012-09-27 09:26:23.395 HSQLDB server 2.2.8 is online on port
9001
[Server@1e893ae]: To close normally, connect and execute SHUTDOWN SQL
[Server@1e893ae]: From command line, use [Ctrl]+[C] to abort abruptly

Ссылки по теме :

Ссылка: Встраивание экземпляра сервера HSQLDB в Spring от нашего партнера по JCG Аллена Джулии в блоге YK’s Workshop .