#java #sqlite
#java #sqlite
Вопрос:
Я пытаюсь реализовать приложение с графическим интерфейсом Java Swing с игрой. Игра заключается в том, чтобы подсчитать, сколько раз нажимается кнопка за 5 секунд.
Я использую sqlite4java
в одном из своих проектов Java GUI. Оно довольно минималистично, поэтому поддерживает только однопоточные приложения.
Я хочу выполнить некоторый SQL-запрос по истечении 5 секунд. У меня есть поток, запущенный в прослушивателе onclick моей кнопки, метод run () которого реализован следующим образом:
run() {
timeLeft = 5;
score = 0;
while(timeLeft>0)
Thread.sleep(100);
timeLeft -= 0.1;
update left time on GUI;
}
// time is up
execute some SQLite INSERT query here;
}
И поскольку sqlite4java поддерживается в одном потоке, оно выдает исключение:
SQLite error:com.almworks.sqlite4java.SQLiteException:
[-98] DB[1] confined(Thread[main,5,]) used (Thread[Thread-3,6,main])
Как я могу выполнить после завершения потока (вне потока)? Возникает исключение, поскольку вызываемый поток и поток, в котором создается экземпляр базы данных (основной поток), не совпадают.
Как я могу подать сигнал основному потоку (и обработать этот сигнал в основном потоке) после завершения этого потока?
Все, чего я хочу достичь, это выполнить запрос, чтобы добавить оценку пользователя в список рекордов. Это не домашнее задание, я пытаюсь разработать приложение для проверки концепции для моей собственной платформы ORM.
Ответ №1:
Как советует @corlettk, вам необходимо создать отдельный поток для операций с базой данных. sqlite4java поставляется с SQLiteQueue, который делает это за вас. Есть учебное пособие и javadoc с примером.
Убедитесь, что вы завершаете ВСЕ операции с базой данных с помощью SQLiteJob (ов) и передаете их в очередь.
Надеюсь, это поможет! Игорь
Ответ №2:
Ahmet,
Я предполагаю, что вам придется выполнять ВСЕ ваши «материалы базы данных» (включая dis / connect) в ОДНОМ потоке, который, вероятно, должен быть выделен для этой цели; возможно, даже «скрытый» за очередью запросов.
Удачи с этим. Можете ли вы «просто» поменять местами СУБД?
Приветствую. Кит.
Комментарии:
1. @Keith, на самом деле я пытаюсь найти способ обмена данными между потоками. sqlite4java не позволяет выполняться в других потоках. Я мог бы реализовать очередь запросов и обработать ее с помощью
.wait()
и.notifyAll()
. Но ищу более элегантное решение. Спасибо.2. @Ahmit, code.google.com/p/sqlite4java говорится: «[An] приложение может открывать несколько подключений к одной и той же базе данных из разных потоков». Для меня это означает, что вы могли бы открыть базу данных в выделенном «потоке DB-service», а затем «скрыть» этот поток за потокобезопасной очередью запросов. Каждый запрос будет представлять собой будущее, позволяющее вам считывать результаты и проверять наличие ошибок. Это все еще довольно запутанно (обнаружение ошибок с задержкой), но, я думаю, это может сработать.