kiki1120 发表于 2013-1-14 23:43:25

HSQL入门(四)随webapp一起启动

Hsqldb的各种好处就不再多说了,今天我们谈谈如何让它在我们日常开发中给我们带来更多的便捷。就像标题所说的,让Hsqldb随WebAPP一起启动。比平时用的DB2、Oracle、SQLServer… …都要简洁方便许多,更重要从开发角度考虑Hsqldb的性能已经足够了。springside也是这么做的。
 
废话不多说了,现在开始:
 
我们借助Listener来实现此功能,先给出一段该Listener的配置信息吧,*^_^*是存在web.xml里的。
<context-param> <param-name>hsql.dbPath</param-name> <param-value>E:\db</param-value> </context-param><context-param><param-name>hsql.dbName</param-name><param-value>demo</param-value></context-param><context-param><param-name>hsql.port</param-name><param-value>9001</param-value></context-param><listener><listener-class>com.demo.HsqlStartListener</listener-class></listener> 简单解释一下:
 
•hsql.dbPath: 采用绝对路径,且是固定的。而在实际应用中在这里我们更需要的是变量[或者说是相对路径。

•hsql.dbName:需要说明的是在E:/db目录下确认有demo.script和demo.properties两个文件.

•hsql.port:设置hsqldb的端口,默认是9001。

接下来我们看看Listener是如何实现的:
package com.demo;import org.hsqldb.Server;import java.io.File;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;/** * 该类的职责是在WebApp启动时自动开启HSQL服务。 * 依然使用Server方式,不受AppServer的影响。 * @author kiki * @since 2010-12-14 */public class HsqlStartListener implements ServletContextListener {private String path;private String dbName;private int port = -1;/** * Listener销毁方法,在Web应用终止的时候执行"shutdown"命令关闭数据库 */public void contextDestroyed(ServletContextEvent arg0) {// 这里就不用说了,自然是关闭数据库操作Connection conn = null;try {Class.forName("org.hsqldb.jdbcDriver");StringBuilder url = new StringBuilder();url.append("jdbc:hsqldb:hsql://");url.append("localhost");url.append(port == 9001 ? "" : ":" + port);url.append("/").append(dbName);conn = DriverManager.getConnection(url.toString(), "sa", "");   Statement stmt = conn.createStatement();stmt.executeUpdate("SHUTDOWN;");} catch (Exception e){e.printStackTrace();}}public void contextInitialized(ServletContextEvent sce) {path = sce.getServletContext().getInitParameter("hsql.dbPath");dbName = sce.getServletContext().getInitParameter("hsql.dbName");try { port = Integer.parseInt(sce.getServletContext().getInitParameter("hsql.port"));}catch(Exception e){port = 9001;}if (dbName == null || dbName.equals("")){System.out.println("Cant’ get hsqldb.dbName from web.xml Context Param");return;   }File dbDir = new File(path);if (!dbDir.exists()) {// 判断目录是否存在if (!dbDir.mkdirs()) {// 如果不存在创建,如果创建失败直接返回System.out.println("Can not create DB Dir for Hsql:" + dbDir);return;}}// 以下代码是做数据库恢复的。我们把原始的数据库放在classpath下,当启动web的时候,检查目标// 数据库是否存在,如果不存在,就把原始数据库复制为指定的数据库if (!path.endsWith("/")){path = path + "/";}File scriptFile = new File(path + dbName + ".script");File propertiesFile = new File(path + dbName + ".properties");if (scriptFile.exists() && propertiesFile.exists()){// 判断数据文件是否存在startServer(path, dbName, port);} else{System.out.println("Connect failed:Connect Hsqldb error or database files not exits!");}}/** * 启动Hsqldb服务的方法 * @param dbPath 数据库路径 * @param dbName 数据库名称 * @param port 所使用的端口号 */private void startServer(String path, String dbName, int port) {// 它可是hsqldb.jar里面的类啊Server server = new Server();server.setDatabaseName(0, dbName);server.setDatabasePath(0, path + dbName);if (port != -1){server.setPort(port);}server.setSilent(true);server.start();System.out.println("hsqldb started…");// 等待Server启动try {Thread.sleep(800);} catch (InterruptedException e){e.printStackTrace();} }} 
现在就部署到Web应用中去尝试一下吧。:)

 

 
页: [1]
查看完整版本: HSQL入门(四)随webapp一起启动