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:
cz.java.skoleni.hsql.HsqldbContextListener
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 času na dotazy ohledně probíraných témat.
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ů.
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ů. Též oceňuji, že jsme se kromě probírané látky dozvěděli i spoustu dalších zajímavých věcí a trendů z IT. A důležitá byla také přátelská atmosféra školení.