Как обрабатывать транзакции записи при превышении времени ожидания запроса в Google App Engine - PullRequest
1 голос
/ 20 октября 2011

Я новичок в Google Engine Engine.Я читаю о App Engine со вчерашнего дня.У меня есть сомнения относительно транзакции записи во время истечения времени ожидания запроса.

Предположим, что я создаю 10000 объектов и пытаюсь сохранить их с помощью одной транзакции (при условии, что DatastoreService похож на транзакцию Hibernate) вот так

    String greeting = "test";
    String guestBookName = "default";
    DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
    Key guestBookKey = KeyFactory.createKey("GuestBook", guestBookName);
    for(int i=0;i<10000;i++)
    {
        Entity entity = new Entity("Greeting", guestBookKey);
        entity.setProperty("date", new Date());
        entity.setProperty("greeting", greeting);
        datastoreService.put(entity);
    }

Предположим, что после сохранения 1000 объектов по истечении времени ожидания запроса будет удалено 1000 объектов?

Я запустил этот код в обработчике приложения после сохранения 1164 объектов вистекло время ожидания запроса данных.Я получил эту ошибку

....Uncaught exception from servlet
com.google.apphosting.api.DeadlineExceededException: This request (0000000000000000)
started at 2011/10/20 07:18:36.726 UTC and was still executing at 2011/10/20 07:19:36.143 UTC.....

Объекты не были удалены из хранилища данных.Кроме того, я прочитал здесь , что

Хранилище данных может выполнять несколько операций в одной транзакции.По определению, транзакция не может быть успешной, если каждая операция в транзакции не завершится успешно.Если какая-либо из операций завершается неудачно, транзакция автоматически откатывается.Это особенно полезно для распределенных веб-приложений, где несколько пользователей могут одновременно получать доступ к одним и тем же данным или манипулировать ими.

Может кто-нибудь, пожалуйста, помогите мне разобраться в этом ясно.

Спасибо всем заранее.

Ответы [ 2 ]

1 голос
/ 20 октября 2011

GAE-транзакции работают только против Entity Group (элементы с одинаковым корнем / родителем).И второе - он использует оптимистическую блокировку , что означает, что транзакция завершается неудачно, когда другой протектор внес изменения до текущей.

Это не традиционные транзакции.Ваш объект не будет удален, если транзакция завершится ошибкой

Пожалуйста, прочитайте http://code.google.com/intl/en/appengine/docs/java/datastore/overview.html#Transactions_and_Entity_Groups

0 голосов
/ 21 октября 2011

Теперь я понял, как обрабатывать записи в хранилище данных.Используя этот код, я смог откатить сохраненные объекты, если время ожидания истекло.Сначала я попробовал этот код без Thread.sleep (int) и с i <10000.Запрос не был выполнен, и когда я зашел в свою программу просмотра Datastore, я не увидел новых записей.Затем я использовал Thread.sleep (int) с i <4 и отправил запрос.На этот раз я мог видеть записи в своей программе просмотра хранилища данных. </p>

Теперь я немного понял о транзакциях и хранилище данных.Спасибо @ splix

package guestbook;

import java.io.IOException;
import java.util.Date;
import java.util.logging.Logger;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.Transaction;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import com.google.apphosting.api.DeadlineExceededException;

@SuppressWarnings("serial")
public class Test extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        Transaction transaction=null;
        try
        {
            String greeting = "test";
            String guestBookName = "default";
            UserService userService = UserServiceFactory.getUserService();
            User user = userService.getCurrentUser();
            DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
            transaction = datastoreService.beginTransaction();
            Key guestBookKey = KeyFactory.createKey("GuestBook", guestBookName);
            for(int i=0;i<4;i++)
            {
                Entity entity = new Entity("Greeting", guestBookKey);
                entity.setProperty("user", user);
                entity.setProperty("date", new Date());
                entity.setProperty("greeting", greeting+" "+i);
                datastoreService.put(entity);
                try {
                    Thread.sleep(1000*2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            transaction.commit();
        }catch(DeadlineExceededException e)
        {
            e.printStackTrace();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            Logger logger = Logger.getLogger(Test.class.getName());
            logger.info(""+transaction.isActive());
            if(transaction!=null)
                if(transaction.isActive())
                    transaction.rollback();
            logger.info(""+transaction.isActive());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...