【问题标题】:hsqldb from java app来自 java 应用程序的 hsqldb
【发布时间】:2011-07-13 14:05:44
【问题描述】:

我正在用java编写一个桌面应用程序来添加/显示员工。我想到了使用hsqldb。我创建了如下程序

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class HSQLDBManualOp {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Connection connection = null;  
        ResultSet resultSet = null;  
        Statement statement = null;
        String createtablestr = "CREATE TABLE employeedetails (EMPNAME varchar(20));";
        String insertstr1 = "INSERT INTO employeedetails (EMPNAME) VALUES ('EMPNAME1')";    
        String insertstr2 = "INSERT INTO employeedetails (EMPNAME) VALUES ('EMPNAME2')";    
        String insertstr3 = "INSERT INTO employeedetails (EMPNAME) VALUES ('EMPNAME3')"; 
        try {
            Class.forName("org.hsqldb.jdbcDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            connection = DriverManager.getConnection("jdbc:hsqldb:file:C:/code/java/march112011aDB", "SA", "");
        } catch (SQLException e) {
            e.printStackTrace();
        }  
        if (connection == null){
            System.out.println(" connection null");
            return;
        }
        try {
            statement = connection.createStatement();
            statement.executeUpdate(createtablestr);

            statement.executeUpdate(insertstr1);

            statement.executeUpdate(insertstr2);
            statement.executeUpdate(insertstr3);

            resultSet = statement.executeQuery("SELECT EMPNAME FROM EMPLOYEEDETAILS");
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            while (resultSet.next()) {  
                System.out.println("EMPLOYEE NAME:" + resultSet.getString("EMPNAME"));  
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

}

}

当我运行程序时,我得到了输出

EMPLOYEE NAME:EMPNAME1
EMPLOYEE NAME:EMPNAME2
EMPLOYEE NAME:EMPNAME3

然后我将插入语句更改为添加 EMPNAME4,EMPNAME5,EMPNAME6

我预计它会打印员工 1,2,3,4,5,6 但是当我运行代码时,我只得到了新值。

EMPLOYEE NAME:EMPNAME4
EMPLOYEE NAME:EMPNAME5
EMPLOYEE NAME:EMPNAME6

使用 jdbc:hsqldb:file 时是否无法保留这些值? 我还想检查表是否已经存在。只有在表不存在时才执行创建表语句。谁能告诉我该怎么做?

或者我必须使用服务器模式吗?如果是,我如何从程序中创建数据库?

请帮忙..这是我第一次尝试 jdbc/hsqldb..

谢谢,

标记

【问题讨论】:

  • 我认为默认情况下 hsqldb 在每次运行时都会重新初始化数据库。如果不是这样,我认为您仍然不会得到预期的结果。在第二次运行时,员工表的创建将失败。见stackoverflow.com/questions/3551988/…
  • 另外,您应该考虑关闭 ResultSet、Statement 和连接对象,最好在 finally 块中。我不认为这会治愈你的问题,但它不会伤害它。

标签: java hsqldb


【解决方案1】:

在没有持久化到数据库之前,我在使用进程内 HSQLDB 时遇到了问题。我发现更改 WRITE_DELAY 参数可以修复它。尝试将以下内容添加到您的 .script 文件中(它应该靠近顶部,可能在类似 GRANT DBA TO SA 之后):

SET WRITE_DELAY 0

【讨论】:

    【解决方案2】:

    据我所知,如果您尝试在第二次运行时创建该表,它不会覆盖前一个表 - 它只会以 SQLException 失败。所以可怕的方法是创建表,然后捕获 SQL 异常(如果它已经存在)并执行其他操作。我不知道 HSqlDB 有什么更好的方法,这与我目前正在开发的程序中使用的技术完全相同。

    在许多基于 SQL 的语言中都有一个CREATE TABLE IF NOT EXISTS 命令,但不幸的是它不在 HSqlDB 中。

    编辑:根据下面的评论,看起来类似的东西实际上是在 2.1 版中。

    【讨论】:

    • HSQLDB 2.1 支持 IF NOT EXISTS
    • @fredt 感谢您指出这一点,我现在将开始在我自己的项目中使用它!我显然有点落后于时代。
    【解决方案3】:

    我们在 Java 应用程序中遇到了这个问题。

    您的 create table 语句会创建一个内存表。

    除了SET WRITE_DELAY 0 语句之外,您还需要在插入之后执行SQL COMMIT,并在您希望HSQL 将内存中的行实际写入配置文件时执行SQL SHUTDOWN

    【讨论】:

    • 有没有办法以编程方式设置 write_delay 值?
    • 你使用 statement.execute("SET WRITE_DELAY 0")。对于 HSQLDB 2.x,该语句是“SET FILES WRITE DELAY 0”。每个数据库只执行一次。在 2.x 中,这可以用于 URL “jdbc:hsqldb:file:C:/code/java/march112011aDB ;hsqldb.write_delay=false” 这足以确保数据在每次提交时完全持久化。
    【解决方案4】:

    HSQLDB v2.1.0 当前下载版本不是 2.1.0 版本,而是旧的 1.8.1 版本。 从 2 月初开始就是这种情况。

    任何为其数据库使用 2.0 版本的人都无法使用它。

    当前的 2.0 版本和 OpenOffice v3.3 似乎存在问题

    如果可以的话,请恢复到版本 1.8 ....

    【讨论】:

    • 2.0 inc RC 1-4 的所有版本都显示 hsqldb.jar 是 1.8.0.1 版本。您的 v2.0 数据库不会连接到这些 jar 中的任何一个。错误代码:UNIQUE line 1 not COLLATE(与 v1.8 中一样)。认为他们正在使用 v2.0 的用户正在面临严重的问题。他们不是。现在迫切需要修复。
    【解决方案5】:

    我遇到了这个问题,花了一个小时左右试图解决这个问题。这对我有帮助。当您第一次在您的 java 应用程序中启动基于文件的 HSQLDB 时,会在 jdbc url 中定义的 db 目录的根目录中创建几个文件。其中一个文件名为mydbname.script,在该文件中查找SET FILES WRITE DELAY 行并将值设置为0。仅当您第一次启动没有 hsqldb.write_delay=false 属性的 HSQLDB 数据库时才需要执行此操作。因此,如果您在第一次启动 HSQLDB 数据库时忘记添加 write_delay 属性,那么您需要更新“mydbname.script”文件。每次启动数据库时都会执行该脚本。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-03-02
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多