1

Google App Engine と Java の JDO を使用してモバイル アプリのサーバー側を開発していますが、データベースへの同時アクセスに問題があります。

私がやっているアプリはチャットで、2 人が同時にデータベースにアクセスすると、メッセージの 1 つが失われます。これは、2 つのアクセスのうちの 1 つがデータベースに保存される前に行われており、メッセージの 1 つが失われているためだと思います。

これに対する解決策を知っていますか?データベース内の同じレジストリへのアクセスを取得し、最近アクセスするためにそれらをキューまたはスタックに入れるようなものです。

前もって感謝します!

これが私のコードです:

会話.java:

import java.util.LinkedList;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType = IdentityType.APPLICATION)  
public class Conversation 
{
    @PrimaryKey  
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
    private Long id;

    @Persistent
    private Long idUser;

    @Persistent(mappedBy = "conversation")
    private LinkedList<Message> messages;

    public Conversation(Long idUser) 
    {
        this.idUser = idUser;

        messages = new LinkedList<Message>();       
    }

    public Long getId() {
        return id;
    }

    public Long getIdUser() {
        return idUser;
    }

    public LinkedList<Message> getMessages() {
        return messages;
    }
}

Message.java:

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;

@PersistenceCapable(identityType = IdentityType.APPLICATION)  
public class Message 
{
    @PrimaryKey  
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
    private Key id;

    @Persistent
    private Conversation conversation;

    @Persistent
    private String text;

    @Persistent
    private String hour;

    public Message(String text, String hour)
    {
        this.text = text;
        this.hour = hour;
    }

    public String getText() 
    {
        return text;
    }

    public String getHour() 
    {
        return hour;
    }

    public Key getId() 
    {
        return id;
    }

    public Conversation getConversation() {
        return conversation;
    }
}

メッセージを保存します。

final PersistenceManager persistenceManager = PMF.get().getPersistenceManager();      

String strQuery = "select from " + Conversation.class.getName() + " where id == " + id;
persistenceManager.getFetchPlan().setGroup(FetchGroup.ALL);
final Query query = persistenceManager.newQuery(strQuery);

try 
{
    List<Conversation> conversations = (List<Conversation>) query.execute;

    Conversation detached = null;
    detached = persistenceManager.detachCopy(conversations.get(0));

    detached.getMessages().add(message);
    persistenceManager.makePersistent(detached);
} finally {
    persistenceManager.close();
}
4

0 に答える 0