Automatický start HSQLDB při startu webové aplikace

publikováno: 3.6.2013

Máme několik možností jak spustit HSQLDB při startu webové aplikace. Nejjednodušší je embedded. K takové databázi je ale možné se připojit pouze z jednoho procesu. Pokud ale chcete s Vaší databází pracovat pomocí externích nástrojů - například abyste se podívali co je v tabulkách ... při vývoji docela důležité :), pak musíte HSQLDB databázi spustit v serverovém režimu:

java -classpath hsqldb.jar org.hsqldb.Server 
-database.0 file:target/hsqldb/test -dbname.0 test

Můžete si udělat skript, který spustíte a tím také spustíte celou databázi. Toto jsem donedávna používal na školeních. Nyní ale budu navíc používat i automatický start HSQLDB při startu webové aplikace pomocí listeneru. K tomu je nutné listener nejprve vytvořit:

import java.sql.*;
import javax.servlet.*;
import org.hsqldb.*;
import org.hsqldb.jdbc.*;
import org.slf4j.*; public class HsqldbContextListener implements ServletContextListener { private Logger logger = LoggerFactory
.getLogger(HsqldbContextListener.class); private Server server; @Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("starting HSQLDB database ...");
try {
// vytvori databazi na disku v: [projekt]/target/hsqldb/
String params = "port = 9001; trace = false; database.0 = file:target/hsqldb/test; dbname.0 = test";
server = new Server();
server.putPropertiesFromString(params);
server.start(); } catch (Exception e) {
e.printStackTrace();
}
} @Override
public void contextDestroyed(ServletContextEvent sce) {
logger.info("stopping HSQLDB database ...");
try {
JDBCDataSource dataSource = new JDBCDataSource();
dataSource.setUrl("jdbc:hsqldb:hsql://localhost/test");
dataSource.setUser("sa");
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection
.prepareStatement("SHUTDOWN");
statement.execute();
statement.close();
connection.close();
} catch (Exception e) {
// Muze vyhodit chybu, protoze databaze se po vyvolani prikazu
// SHUTDOWN zacne zavirat. Proto tuto chybu nezobrazuji klientovi.
}
while (server.getState() != 16) {
logger.info("waiting for shutdown ...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

 

A poté ho ve web.xml zapojit:

<listener>
<listener-class>cz.java.skoleni.hsql.HsqldbContextListener</listener-class>
</listener>

Pozor! Pokud máte více listenerů, pak v souboru web.xml záleží na jejich pořadí! Tento listener by měl být definován jako první!

Reference

Jedno z nejlepších školení za poslední roky. Kromě seznámení se Springem apod. mě velmi příjemně překvapila hluboká znalost probírané látky a schopnost ji srozumitelně vysvětlit v případě ad hoc dotazů.

Jaroslav

Velmi jsem oceňoval různorodost školení a široký záběr z java světa + schopnost rychle reagovat na všechny otázky, ať se týkaly jakéhokoliv tématu v Javě. Také se mi líbili různé

Marek

uvolnena atmosfera. nekdo by si mozna myslel, ze az moc, ale mne to tak vyhovuje a paradoxne pomaha k soustredeni :) no a spousta zajimavosti, preci jen je citit, kdyz s

Vojtěch


Novinky

20.10.2019: Don't Put Fat Jars in Docker Images: Optimalizace

20.10.2019: Spring Boot 2.2.0!!!

20.10.2019: JDBC Driver Maven dependency list: Oracle drivery jsou v Maven Central!!!