我一直在愉快地使用XAMPP進行開發,直到不得不將其托管在可通過Internet訪問的某個地方,供客戶端進行測試和使用。 我有一個僅具有384 RAM的VPS,并且需要快速找到一種方法,因此決定將XAMPP安裝到VPS中。 由于內存不足,因此當MySQL運行時,即使初始Java堆大小設置為64m,Tomcat也無法啟動。 在移至OpenShift之前,我設法將網站臨時托管在Jelastic中。
我玩弄了將數據庫和應用程序服務器實例合并在1個JVM中的想法,以減少RAM使用(與運行MySQL + Tomcat相比)。 搜索Internet之后,我發現了與Tomcat一起運行HSQL服務器實例的幾篇文章。 毫無疑問,我必須先更新站點以使其與HSQL兼容,但是作為POC(概念驗證)嘗試,我決定探索在Spring容器中運行HSQL服務器實例的可行性。
像在Spring中的bean一樣運行HSQL服務器有幾個原因:
1.多合一配置。 所需配置的一切都在Spring中完成。 Net中有一些示例可以與Tomcat一起運行HSQL實例,但這需要向Tomcat中添加內容(請參見下面的鏈接)。
2.應用程序服務器獨立性。 “理論上”(用引號表示,因為我僅在Tomcat中成功對其進行了測試),由于一切都在Spring中完成,因此不需要或幾乎不需要在應用服務器中進行配置。
HSQL服務器“ bean”還旨在以網絡模式(不是進程內(例如,mem或文件))啟動實例。 原因如下:
1.“ mem”進程內訪問是最快的,但不是持久的。 還有其他一些方法可以使用Spring的spring-jdbc標簽來啟動“ mem”數據源,這是一種更好的方法。
2.“文件”進程內訪問是持久性的,但與“內存”一樣,它只能在Java進程內訪問。
3.網絡模式(hsql)是持久性的,并且可以使用外部JDBC客戶端工具訪問。 這對于故障排除和驗證很有用。
閱讀HSQLDB的文檔后,下面是執行HSQL服務器實例bean生命周期管理的代碼:
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);}@Overridepublic boolean isRunning(){if(server != null)server.checkRunning(running);return running;}@Overridepublic 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);}}}@Overridepublic void stop(){logger.info('Stopping HSQL server...');if(server != null){server.stop();running = false;}}@Overridepublic int getPhase(){return 0;}@Overridepublic boolean isAutoStartup(){return true;}@Overridepublic void stop(Runnable runnable){stop();runnable.run();}
}
簡化的Spring配置:
server.database.0=file:d:/hsqldb/demobaseserver.dbname.0=demobaseserver.remote_open=truehsqldb.reconfig_logging=false
在Tomcat中啟動Spring時的示例輸出:
[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/
參考: YK的Workshop博客中的JCG合作伙伴 Allen Julia 在Spring中嵌入了HSQLDB服務器實例 。
翻譯自: https://www.javacodegeeks.com/2012/11/embedding-hsqldb-server-instance-in-spring.html