Relační databáze HSQLDB je celá napsaná v jave. Je malá, rychlá, s podporou mnoha vláken, umožňující použití LOBů (large objects) a transakcí. Je velice jednoduchá na použití a hodí se jak na vývoj API, začátky projektu (kdy ještě nejsou přesně definovány specifikace db a nejsou připravené prostředí pro vývoj) nebo třeba pro JUnit testy.
Asi nemá cenu probírat dopodrobna specifikace tohoto maličkého nástroje, odkážu vás na domovské stránky projektu http://hsqldb.org/, případně na http://sourceforge.net/projects/hsqldb/.
S tímto nástrojem mám dobré zkušenosti, proto jsem se rozhodl, že zde ukážu jednoduchou ukázku použití :). Budeme pracovat s verzí 1.8.0.7 a pomůže nám orm framework Hibernate verze 3.3.1.GA a Spring container verze 2.5.6.
Nejdříve si definujeme ve spring kontextu dataSource (zde využijeme knihovny jakarta-commons modulu dbcp pro DataSource holder). Nadefinujeme property driver, url, username a password. V případě, že bychom potřebovali in-memory databázy, nastavíme url na hodnotu jdbc:hsqldb:mem:db_test.
<bean id="dataSource" scope="singleton" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:db_test"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
Vytvoříme si hibernateFactory.
<bean id="hibernateFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.EhCacheProvider
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.use_sql_comments">true</prop>
</props>
</property>
<property name="dataSource" ref="dataSource"/>
<property name="schemaUpdate" value="true"/>
<property name="mappingLocations" value="classpath*:project/**/*.hbm.xml"/>
</bean>
Vytvoříme si domain objekty s mapováním podle specifikace hibernate a cestu uvedeme do hodnoty property mappingLocations, pokud nastavíme propertě schemaUpdate true, tak se při inicializaci této beany vytvoří v db tabulky automaticky.
Teď máme v podstatě databázy připravenou pro použití, db pracuje s daty, které má na filesystemu.
Pří používání jsem narazil na problém, že se neuvolňuje spojení s db. Vyřešil jsem to abstraktní třídou, z které všechny testy dědí. Je potřeba zavolat příkaz SHUTDOWN (podle specifikace HSQLDB), který connectionu uvolní.
@ContextConfiguration(locations = {"classpath:spring/*.xml"})
public abstract class AbstractTest
extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
private BasicDataSource dataSource;
@After
public void afterTest() throws SQLException {
Statement statement = dataSource.getConnection().createStatement();
statement.execute("SHUTDOWN");
statement.close();
}
}
Pro vyzkoušení této technologie by to mělo být vše. Tak s požehnáním do toho! :)
Ahoj Viki,
OdpovědětVymazatDíky za srozumitelný článek, mám dotaz, co by se stalo, kdybych tam nedal ten SHUTDOWN?
Díky za komentář. Db si vytvoří na filesystemu soubory a když neuvolníme spojení, soubory jsou pořád používány předchozím procesem. Vyhodí to vyjímku java.sql.SQLException: The database is already in use by another process.
OdpovědětVymazat