2012-02-16 11 views
1

私は今、いくつかの時間のためにプレイ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(); 
} 

を私は投稿と投稿の検索のストリームマネージャ処理通知を持っています。

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"があること。私は別のretrievePost()でポストにアクセスしようとしている間に1つのスレッドがexecutePost()にまだあるので、これがあると思われます。ポストは「保存」されていることを考えると、しかし、ロックが解除されているべきではないのですか?これは本当に理由ですか、エラーの周りには何か方法がありますか?

ありがとうございました。

+0

私がプレイしてJPAが、最初のステップについてはあまり知らないがexecutePost'、' newPost.save() 'の周りにいくつかのログ・ステートメントを置くことです –

答えて

1

他の誰かが同様の問題を抱えている場合:await()を使用して明示的に呼び出し元のスレッドをスリープさせることで修正しました。つまり、すべてのロックを諦めて、retrievePost()のスレッドをテーブルに許可します。あなたの仮説を確認するために、 `;` Post.findAll() `と、

関連する問題