Dear All,

I'm using HSQLDB as embedded in-process mode for my web application. I used
to schedule every 1 minutes to check on the HSQLDB database. I open the db
when context initialized and close it when context destroyed. But when the
context reloaded I always get Java.lang.NullPointerException when trying to
execute SQL statement.

What is wrong ?? It looks like everytime the context is destroyed... the
hsqldb gets lock.

The snippet code like below :
=======================

import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;

import java.nio.channels.ClosedByInterruptException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Random;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ContextStartUp implements ServletContextListener {

    private ServletContext context = null;
    MyThread objThread = null;

    ResultSet rs = null;
    Connection conn = null;

    public void openDB()
    {

        try {
            conn = DriverManager.getConnection("jdbc:hsqldb:file:" +
context.getRealPath("/data/testdb") + ";ifexists=true;shutdown=true;", "sa",
"phidmspassword");

        } catch (SQLException e) {
            e.printStackTrace();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }


    public void closeDB()
    {
        Statement stmt = null;
        try {
            if(conn!=null)
            {
                stmt = conn.createStatement();
                stmt.execute("SHUTDOWN COMPACT");
                stmt.close();
                conn.close();
                stmt = null;
                conn = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public class MyThread implements Runnable {

        int nomor = 0;

        Thread currentthread = null;

        public MyThread() {
            if (currentthread == null) {
                currentthread = new Thread(this);
                currentthread.setPriority(new Random().nextInt(5) + 1);
                currentthread.start();
            }
        }

        public void run() {
            Statement stmt = null;

            String sqltodo = "";
            Thread myThread = Thread.currentThread();

            while (myThread == currentthread) {
                try {
                    stmt = conn.createStatement();

                    if (stmt.execute("A select statement...... "))
                    {
                        rs = stmt.getResultSet();

                        if (rs.next()) {
                            ..........................
                        }
                    }


                       sqltodo = Update queries ......;

                        stmt.executeUpdate(sqltodo);
                        stmt.execute("SHUTDOWN");
                        stmt.close();
                    }
                    else
                    {
                        stmt.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    stmt = null;
                }

                try {
                    Thread.sleep(100000);
                } catch (InterruptedException e) {
                }
            }
        }

    }

    public void initThread() {
        openDB();
        objThread = new MyThread();
    }

    public void stopThread() {
        objThread = null;
        closeDB();
    }

    public void contextDestroyed(ServletContextEvent event) {
        context = null;
        stopThread();
    }

    public void contextInitialized(ServletContextEvent event) {
        try {
            Class.forName("org.hsqldb.jdbcDriver").newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        context = event.getServletContext();

        initThread();
    }
}

==============================================================


--
Regards,
Feris
PT. Putera Handal Indotama
JL. KH. Moh. Mansyur No. 11 Blok B.8-12
Telp. +62-21-631 6688 (Hunting)
Fax. +62-21-6330211
Jakarta (10140) - INDONESIA

Reply via email to