pátek 11. prosince 2009

Java databáze HSQLDB

    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! :)


2 komentáře:

  1. Ahoj Viki,
    Díky za srozumitelný článek, mám dotaz, co by se stalo, kdybych tam nedal ten SHUTDOWN?

    OdpovědětVymazat
  2. 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