3

プログラムでHSQLdbサーバーを起動したい。以下のようなランナブルを作成し、スレッドで開始します。

   Runnable hsqlRunnable = new Runnable() {
                public void run()
                {

                    HsqlProperties props = new HsqlProperties();
                    props.setProperty("server.database.0", "file:C:\Documents and Settings\BThirup\Application Data\Rockwell Automation\FactoryTalk ProductionCentre\logs\ApplicationLog\mydb;shutdown=true;");
                    props.setProperty("server.dbname.0", "xdb");
org.hsqldb.Server server = new org.hsqldb.Server();

                    try {
                        server.setProperties(props);
                    } catch (Exception e) {
                        return;
                    }

                    server.start();
}
}

エラーが発生します:[Thread [HSQLDB Server @ 4db602,6、main]]:開いているデータベースがないためシャットダウンします

誰かが私がどこで間違っているのかを指摘するのを手伝ってもらえますか?

バラを助けてくれてありがとう

4

3 に答える 3

4

別のクラスを使用して、HSQLdbサーバーインスタンスを管理できます。

public class DBManager {

    final String dbLocation = "c:\\temp\\"; // change it to your db location
    org.hsqldb.server.Server sonicServer;
    Connection dbConn = null;

    public void startDBServer() {
        HsqlProperties props = new HsqlProperties();
        props.setProperty("server.database.0", "file:" + dbLocation + "mydb;");
        props.setProperty("server.dbname.0", "xdb");
        sonicServer = new org.hsqldb.Server();
        try {
            sonicServer.setProperties(props);
        } catch (Exception e) {
            return;
        }
        sonicServer.start();
    }

    public void stopDBServer() {
        sonicServer.shutdown();
    }

    public Connection getDBConn() {
        try {
            Class.forName("org.hsqldb.jdbcDriver");
            dbConn = DriverManager.getConnection(
                    "jdbc:hsqldb:hsql://localhost/xdb", "SA", "");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dbConn;
    }
}

このクラスを次のように使用します。

public class WFProcess extends Thread {

    DBManager dbm = new DBManager();

    public static void main(String[] args) {
        (new WFProcess()).start();
    }

    public void run() {
        dbm.startDBServer();

        // some usefull server work here
        Connection conn = dbm.getDBConn();
        try {
            Statement stmt = conn.createStatement();
            stmt.executeQuery("CREATE TABLE IF NOT EXISTS answers (num INT IDENTITY, answer VARCHAR(250))");
            stmt.executeQuery("INSERT INTO answers (answer) values ('this is a new answer')");
            ResultSet rs = stmt.executeQuery("SELECT num, answer FROM answers");
            while (rs.next()) {
                System.out.println("Answer number: " + rs.getString("num")
                        + "; answer text: " + rs.getString("answer"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // end of usefull server work

        dbm.stopDBServer();
    }
}
于 2014-09-03T10:05:17.910 に答える
0

コメントしたように、server.setTrace(true)はトラブルシューティングに役立ちます。server.setSilent(false)も同様です。

ただし、サーバーを起動するためにRunnableを作成して起動しないでください。Serverクラスはそのすべてを実行し、必要なスレッドを開始します。

于 2012-04-25T22:21:10.223 に答える
0

HSQL 2.3.xの場合、HSQLをWebサーバー(ネットワークにポート80を使用するHSQLサーバー)として実行するには、以下を参照してください。

https://stackoverflow.com/a/37784679/15789

于 2016-06-13T08:17:29.313 に答える