Я уже некоторое время использую JPA в Play Framework, и все шло хорошо - однако сейчас я столкнулся с ошибкой, для которой я не вижу никаких очевидных решений.Просто для некоторого контекста я пытаюсь создать простую социальную сеть.
У меня есть класс Post:
public class Post extends Model {
private String owner;
private long timestamp;
@ElementCollection
private List<String> viewers;
private String content;
public Post(String owner, List<String> viewers, String content) {
this.timestamp = System.currentTimeMillis();
this.owner = owner;
this.viewers = viewers;
this.content = content;
System.out.println("Saving post by " + owner + " with timestamp:" + this.timestamp);
}
(Getters and setters ignored here)
}
У меня есть класс User, который добавляет сообщения:
public long addPost(String viewers, String content) {
LinkedList<String> viewersList = new LinkedList(Arrays.asList(viewers.split(",")));
Post newPost = new Post(this.name, viewersList, content);
newPost.save();
return newPost.getTimestamp();
}
И у меня есть StreamManager, обрабатывающий уведомления о сообщениях и поиск сообщений.
public static void executePost(String content, String viewers) {
System.out.println("Post content: " + content);
String user = session.get("username");
User u = User.connect(user);
if (u == null) {
System.out.println("User is null");
}
/* Add post to local record of posts */
long timestamp = u.addPost(viewers, content);
/* Send notification of post to server */
}
Я запускаю свое приложение с пулом потоков из 3 потоков, что означает, что в системе есть некоторый уровень параллелизма.Пока система ожидает ответа от сервера после уведомления (конец executePost), другой поток пытается получить доступ к вновь созданному сообщению, используя этот код:
public static void retrievePost(String owner, String timestamp) {
byte[] postAndKey = new byte[1024];
byte[] post = null;
byte[] encryptedKey = null;
User u = User.connect(owner);
Post.findAll();
//List<Post> posts = (Post.find("byOwner", owner).fetch());
System.out.println("Looking for post by " + owner + " at timestamp: " + timestamp);
//System.out.println("Looking through: " + posts.size() + " posts");
В Post.findAll()
платформа выдаетнеприятная ошибка, говорящая, что есть Timeout trying to lock table "POST"
.Я подозреваю, что это потому, что один поток все еще находится в executePost()
, в то время как другой пытается получить доступ к сообщению в retrievePost()
.Однако, учитывая, что сообщение было «сохранено», разве блокировка не должна быть снята?Это действительно причина, и есть ли способ обойти ошибку?
Спасибо.