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í!
Školení mi pomohlo ujasnit si jak má správně probíhat testování kódu, představilo užitečné knihovny a nástroje. Vše bylo podáno zábavnou formou, takže nebyl problém udržet pozornost. Navíc byl výhodou dostatek
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ů.
Přestože jsem Cčkař, tak jsem se na školení JUnit dozvěděl nové věci. Zejména co se týče metodiky jednotkového testování a některých odborných termínů.