JRuby и HSQLDB: случайно пропущенные строки - PullRequest
1 голос
/ 22 августа 2011

У меня есть следующие коды:

# my db connection is here:
# @connection = DriverManager.getConnection("jdbc:hsqldb:file:../db/rdata", "user", "user")

#the method recieves a array of hash {:rev,:time,:path,:result}
def create(list)
    st=@connection.createStatement()
    sql=""
    list.each do |i|
        sql.concat("INSERT INTO RESULTS_LOGIN (REVISION, TIMESTAMP, ARCHIVEPATH, RESULTS) VALUES (#{i[:rev]},'#{i[:time]}','#{i[:path]}','#{i[:result]}');\n")
    end
    p sql.lines.to_a.size
    st.execute(sql)
    st.close
end  

Проблема:

Значение sql.lines.to_a.size равно 128, что означает, что у меня есть 128 строк для вставки. Однако, после многократного повторного запуска, я обнаружил, что каждый раз, когда я получаю разные строки в БД. Например, на этот раз таблица RESULT_LOGIN имеет 114 строк, а в следующий раз было 99 .... Также есть успешные прогоны, в результате которых в таблице было 128 строк.

Я не могу понять, почему это происходит. Нет ошибок, нет исключений, и что странно, что в моем коде есть метод сразу после метода «create», который выполняет «select * from RESULTS_LOGIN» и печатает его, например:

create(list) # insert rows
read_all # print all rows  

Каждый раз «read_all» сразу после «create» выводит 128 строк и правильные данные; Тем не менее, если я буду запускать read_all отдельно после закрытия и воссоздать соединение или просмотреть базу данных с помощью инструмента управления графическим интерфейсом HSQLDB, некоторые строки будут отсутствовать ....

1 Ответ

1 голос
/ 22 августа 2011

Для таких тестов вам нужно добавить дополнительную настройку либо в URL, либо в качестве выполненного оператора SQL.Это делается для того, чтобы все неписанные данные сохранялись в конце теста.Смотрите мой ответ на этот вопрос:

что-то смешное со встроенным hsql

...