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

Velmi se mi líbila přátelská a neformální atmosféra a viditelné nadšení a zapojení přednášejícího do problematiky a tudíž skutečně zajímavé příklady z praxe a možnost zeptat se prakticky na jakoukoliv

Ondřej

Školenie a celkovo prístup školitela hodnotím veĺmi kladne. Celé školenie bolo priposobené znalostiam skupiny (v našej skupine sa preskočili úplne základy a riešili sa konkrétne rozšírujúce znalostí). Školenie neprebiehalo odrozpravaním

Martin

Školení se mi moc líbilo, použití novinek v javě na konkrétních případech použití a vždy srozumitelně vysvětleno. Školitel má převyšující kvalifikaci a dokáže informace správnou formou předávat dál. Moc se

Robin


Novinky

26.9.2017: RebelLabs Developer Productivity Report 2017
Další rok, další RebelLabs report :-)

14.9.2017: Java release cycle zrychluje & Java Flight Recorder zdarma
Dlouhé mnohaleté prodlevy mezi jednotlivými major releasy v Javě končí!

14.9.2017: Java EE se stěhuje do nadace Eclipse Foundation
Co to znamená?