Я с радостью использовал 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/demobaseserver.dbname.0=demobaseserver.remote_open=truehsqldb.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 logInfoEventINFO: checkpointClose startSep 27, 2012 9:26:23 AM org.hsqldb.persist.Logger logInfoEventINFO: checkpointClose end[Server@1e893ae]: Database [index=0, id=0, db=file:d:/hsqldb/demobase, 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 port9001[Server@1e893ae]: To close normally, connect and execute SHUTDOWN SQL[Server@1e893ae]: From command line, use [Ctrl]+[C] to abort abruptly |
Ссылки по теме :
- http://hsqldb.org/doc/2.0/guide/index.html
- http://dkuntze.wordpress.com/2009/01/28/hsql-on-tomcat/
- http://www.ibm.com/developerworks/data/library/techarticle/dm-0508bader/
Ссылка: Встраивание экземпляра сервера HSQLDB в Spring от нашего партнера по JCG Аллена Джулии в блоге YK’s Workshop .