решение для многопоточной поддержки sqlite4java

#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», а затем «скрыть» этот поток за потокобезопасной очередью запросов. Каждый запрос будет представлять собой будущее, позволяющее вам считывать результаты и проверять наличие ошибок. Это все еще довольно запутанно (обнаружение ошибок с задержкой), но, я думаю, это может сработать.