package com.mossle.simulator.hsqldb;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hsqldb.Server;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 控制数据库的周期. context启动的时候,启动hsqldb数据库服务器,context关闭时shutdown数据库服务器
*
* @author Lingo
* @version 1.0
* @since 2007-03-13
* @see javax.servlet.ServletContextListener
*/
public class HsqldbServer {
private static Logger logger = LoggerFactory.getLogger(HsqldbServer.class);
/**
* 等待数据库停止的最大时间.
*/
public static final int WAIT_TIME = 1000;
private boolean enabled = false;
/**
* 登陆用户名.
*/
private String username;
/**
* 登陆密码.
*/
private String password;
private int port;
private String path;
private String databaseName;
private String url;
@PostConstruct
public void init() {
if (!enabled) {
logger.info("skip hsqldb server");
return;
}
try {
String databasePath = path + "/" + databaseName;
url = "jdbc:hsqldb:hsql://localhost:" + port + "/" + databaseName;
Server server = new Server();
server.setDatabaseName(0, databaseName);
server.setDatabasePath(0, databasePath);
server.setPort(port);
server.setSilent(true);
server.start();
Thread.sleep(WAIT_TIME);
} catch (InterruptedException ex) {
logger.error(ex.getMessage(), ex);
}
}
@PreDestroy
public void destroy() {
if (!enabled) {
logger.info("skip hsqldb server");
return;
}
try {
Class.forName("org.hsqldb.jdbcDriver");
Connection conn = null;
Statement state = null;
try {
// 向数据库发送shutdown命令,关闭数据库
conn = DriverManager.getConnection(url, username, password);
state = conn.createStatement();
state.executeUpdate("SHUTDOWN;");
} catch (SQLException ex1) {
logger.error(ex1.getMessage(), ex1);
} finally {
// 确保关闭Statement
if (state != null) {
try {
state.close();
state = null;
} catch (SQLException ex1) {
logger.error(ex1.getMessage(), ex1);
}
}
// 确保关闭Connection
if (conn != null) {
try {
conn.close();
conn = null;
} catch (SQLException ex1) {
logger.error(ex1.getMessage(), ex1);
}
}
}
} catch (ClassNotFoundException ex) {
logger.error(ex.getMessage(), ex);
}
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setPort(int port) {
this.port = port;
}
public void setPath(String path) {
this.path = path;
}
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}