Я с радостью использовал 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 |
Ссылки по теме :
- 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 .