【发布时间】:2012-03-08 03:35:57
【问题描述】:
我在 Play Framework 中使用 JPA 已经有一段时间了,一切都很顺利 - 但是,我现在遇到了一个错误,我没有看到任何明显的解决方案。仅就某些情况而言,我试图创建的是一个基本的社交网络。
我有一个 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)
}
我有一个添加帖子的用户类:
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 结束)等待来自服务器的响应时,另一个线程正在尝试使用以下代码访问新创建的 Post:
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() 中的帖子。但是,考虑到 Post 已被“保存”,锁不应该被释放吗?真的是这个原因吗,有没有办法解决这个错误?
谢谢。
【问题讨论】:
-
我对 Play 和 JPA 了解不多,但第一步是在
executePost、newPost.save();和Post.findAll();周围添加一些日志语句以确认您的假设
标签: java database jpa playframework