前面已经看到HSQLDB可以在同一个JVM中以服务的形式启动,我们可以在应用启动的时候,比如在app加载的时候,在listener中启动数据库,然后就可以使用数据库了,不需要再去专门启动数据库。
下面是我写的DatabaseThread以及测试代码,可以把启动的工作放到app加载的时候。
下面是我写的DatabaseThread以及测试代码,可以把启动的工作放到app加载的时候。
package rst.hsqldb.start; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.hsqldb.Server; import junit.framework.TestCase; /** * Class description. * * @author rst */ public class TestStartServerInCode extends TestCase { /* * @see TestCase#setUp() */ protected void setUp() throws Exception { DatabaseThread db = new DatabaseThread(); //mostly can add 10 database instance. db.addDatabase("db/db"); new Thread(db).run(); //wait for finishing start. Thread.sleep(5000); } /* * @see TestCase#tearDown() */ protected void tearDown() throws Exception { } public void testStart() throws ClassNotFoundException, SQLException{ Class.forName("org.hsqldb.jdbcDriver"); Connection conn=DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/db;ifexists=true","sa",""); assertNotNull(conn); conn.close(); } } class DatabaseThread implements Runnable { private String address = "localhost"; private int port = 9001; private boolean silent = true; private boolean trace = true; private List databases = new ArrayList(); public void addDatabase(String path){ databases.add(path); } /** * @return Returns the address. */ public String getAddress() { return address; } /** * @param address The address to set. */ public void setAddress(String address) { this.address = address; } /** * @return Returns the databases. */ public List getDatabases() { return databases; } /** * @param databases The databases to set. */ public void setDatabases(List databases) { this.databases = databases; } /** * @return Returns the dbnames. */ public String[] getDbnames() { return dbnames; } /** * @param dbnames The dbnames to set. */ public void setDbnames(String[] dbnames) { this.dbnames = dbnames; } /** * @return Returns the port. */ public int getPort() { return port; } /** * @param port The port to set. */ public void setPort(int port) { this.port = port; } /** * @return Returns the silenct. */ public boolean isSilent() { return silent; } /** * @param silenct The silenct to set. */ public void setSilent(boolean silent) { this.silent = silent; } /** * @return Returns the trace. */ public boolean isTrace() { return trace; } /** * @param trace The trace to set. */ public void setTrace(boolean trace) { this.trace = trace; } private String[] dbnames; /* (non-Javadoc) * @see java.lang.Runnable#run() */ public void run() { String[] args = null; ArrayList list = new ArrayList(); if(address != null){ list.add("-address"); list.add(address); } if(port != 0){ list.add("-port"); list.add(""+port); } list.add("-silent"); list.add("" + silent); list.add("-trace"); list.add("" + trace); for(int i = 0; i < databases.size(); i++){ list.add("-database." + i); list.add((String) databases.get(i)); list.add("-dbname." + i); String database = (String) databases.get(i); String dbname = database.substring(database.lastIndexOf("/")+1); list.add(dbname); } //args = (String[]) list.toArray(); args = new String[list.size()]; for(int i = 0; i < list.size(); i++){ args = (String) list.get(i); System.out.println(args); } //System.out.println(args); //调用HSQLDB的服务入口 Server.main(args); } } |