Проблема Java и SQLite - PullRequest
       3

Проблема Java и SQLite

2 голосов
/ 01 апреля 2011


Я написал Java-программу, которая должна заполнять базу данных sqlite несколькими строками, сгенерированными алгоритмом.Таким образом, я получаю доступ к БД и вставляю свои строки ... Это продолжается несколько секунд, но:

1.30168691E9s 100 -> '0 1 2 5 8', 0, 0, 0
3.163s 200 -> '0 1 2 7 17', 0, 0, 0
3.158s 300 -> '0 1 2 9 30', 0, 0, 0
Исключение в потоке "main"java.sql.SQLException: невозможно открыть файл базы данных
в org.sqlite.DB.execute (DB.java:275)
в org.sqlite.DB.executeUpdate (DB.java:281)
at org.sqlite.Stmt.executeUpdate (Stmt.java:103)
at grid0.GridFill.fillTable (GridFill.java:26)
at grid0.GridFill.writeCombs (GridFill.java:54)
at grid0.Main.main (Main.java:15)
Результат Java: 1

программа идет на первые 300 строк, но затем вылетает ... и я не могупонимаю почему.Мне нужна помощь ...

Спасибо ...

public void fillTable (String hand) выдает Исключение
{
String data = "'" +hand + "', 0, 0, 0";
if (count% 100 == 0)
{
System.out.println ((System.currentTimeMillis () - time) / (float)1000 + "s" + count + "->" + data);
time = System.currentTimeMillis ();
}
stat.executeUpdate ("вставить в руки (Hand, Lock, Done,SubstitutionNumber) VALUES ("+ data +") ");
}

1 Ответ

2 голосов
/ 07 апреля 2011

Во-первых, мне повезло больше, используя драйвер sqlite jdbc от xerial.org, его можно найти здесь: http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC Кажется, Xerial обновляет свой диск гораздо чаще, чем zentus.

При работе с jdbc лучше всего использовать PreparedStatements.Подготовленные заявления позволят вам выполнять такие вещи, как выполнение пакета вставок.Вместо того, чтобы выполнять несколько вызовов executeUpdate, вы можете выполнять их все одновременно с помощью пакета.Смотрите следующие ссылки для примеров пакетов и PreparedStatements: http://download.oracle.com/javase/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html http://download.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/preparedstatement.html

Базовый пример кода, который вам понадобится:

PreparedStatement stmt = con.prepareStatement(
    "INSERT INTO employees('salary', 'name') VALUES (?, ?)");

stmt.setInt(1, 2000);
stmt.setString(2, "Kelly Kaufmann");
stmt.addBatch();

stmt.setInt(1, 3000);
stmt.setString(2, "Bill Barnes");
stmt.addBatch();

// submit the batch for execution
stmt.executeBatch();

setInt (index, value) позволяет вамзаменить '?'в PreparedStatement со значением.С пакетом и подготовленным заявлением вы можете сделать это несколько раз и выполнить их все сразу в конце, когда вы вызываете executeBatch ().

Также, как указано комментаторами, не забудьте закрыть соединение с БД один разВы закончили вставку.Также вы захотите закрыть все Результирующие наборы, которые могут быть открыты, выбрав из БД.

Надеюсь, это поможет.

-Alex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...