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();
}