Что такое «операции чтения внутри транзакций не могут разрешить аварийное переключение»? - PullRequest
1 голос
/ 13 июня 2010

Время от времени я получал следующее сообщение об исключении в GAE для моего Приложение GAE / J Я искал в Google, релевантных результатов не найдено. Есть ли кто-нибудь знает об этом? Заранее спасибо за любой ответ!

Сообщение об исключении, как показано ниже:

Вложено в org.springframework.orm.jpa.JpaSystemException: Незаконный аргумент; вложенное исключение javax.persistence.PersistenceException: Нелегальный аргумент: java.lang.IllegalArgumentException: операции чтения внутри транзакций невозможно разрешить переключение при сбое на com.google.appengine.api.datastore.DatastoreApiHelper.translateError (DatastoreApiHelper.java: 34) на com.google.appengine.api.datastore.DatastoreApiHelper.makeSyncCall (DatastoreApiHelper.java: 67) на com.google.appengine.api.datastore.DatastoreServiceImpl $ 1.run (DatastoreServiceImpl.java:128) на com.google.appengine.api.datastore.TransactionRunner.runInTransaction (TransactionRunner.java: 30) на com.google.appengine.api.datastore.DatastoreServiceImpl.get (DatastoreServiceImpl.java: 111) на com.google.appengine.api.datastore.DatastoreServiceImpl.get (DatastoreServiceImpl.java: 84) на com.google.appengine.api.datastore.DatastoreServiceImpl.get (DatastoreServiceImpl.java: 77) в org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.get (RuntimeExceptionWrappingDatastoreService.java: 53) в org.datanucleus.store.appengine.DatastorePersistenceHandler.get (DatastorePersistenceHandler.java: 94) в org.datanucleus.store.appengine.DatastorePersistenceHandler.get (DatastorePersistenceHandler.java: 106) в org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject (DatastorePersistenceHandler.java: 464) в org.datanucleus.state.JDOStateManagerImpl.loadUnloadedFieldsInFetchPlan (JDOStateManagerImpl.java: 1627) в org.datanucleus.state.JDOStateManagerImpl.loadFieldsInFetchPlan (JDOStateManagerImpl.java: 1603) at org.datanucleus.ObjectManagerImpl.performDetachAllOnCommitPreparation (ObjectManagerImpl.java: 3192) в org.datanucleus.ObjectManagerImpl.preCommit (ObjectManagerImpl.java: 2931) в org.datanucleus.TransactionImpl.internalPreCommit (TransactionImpl.java: 369) в org.datanucleus.TransactionImpl.commit (TransactionImpl.java:256) в org.datanucleus.jpa.EntityTransactionImpl.commit (EntityTransactionImpl.java: 104) в org.datanucleus.store.appengine.jpa.DatastoreEntityTransactionImpl.commit (DatastoreEntityTransactionImpl.java: 55) в name.kenyth.playtweets.service.Tx.run (Tx.java:39) в name.kenyth.playtweets.web.controller.TwitterApiController.persistStatus (TwitterApiController.java: 309) в name.kenyth.playtweets.web.controller.TwitterApiController.processStatusesForWebCall (TwitterApiController.java: 271) в name.kenyth.playtweets.web.controller.TwitterApiController.getHomeTimelineUpdates_aroundBody0 (TwitterApiController.java: 247) в name.kenyth.playtweets.web.controller.TwitterApiController $ AjcClosure1.run (TwitterApiController.java:1) в name.kenyth.playtweets.web.refine.AuthenticationEnforcement.ajc $ Около $ name_kenyth_playtweets_web_refine_AuthenticationEnforcement $ 2 $ 439820b7proceed (AuthenticationEnforcement.aj: 1) в name.kenyth.playtweets.web.refine.AuthenticationEnforcement.ajc $ Около $ name_kenyth_playtweets_web_refine_AuthenticationEnforcement $ 2 $ 439820b7 (AuthenticationEnforcement.aj: 168) в name.kenyth.playtweets.web.controller.TwitterApiController.getHomeTimelineUpdates (TwitterApiController.java: 129) at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Метод) at sun.reflect.NativeMethodAccessorImpl.invoke (Неизвестно Источник) at sun.reflect.DelegatingMethodAccessorImpl.invoke (НеизвестноИсточник) в java.lang.reflect.Method.invoke (Method.java:43) в org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod (HandlerMethodInvoker.java: 710) в org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod (HandlerMethodInvoker.java: 167) в org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod (AnnotationMethodHandlerAdapter.java: 414) в org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle (AnnotationMethodHandlerAdapter.java: 402) в org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java: 771) в org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java: 716) в org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java: 647) в org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java: 552) на javax.servlet.http.HttpServlet.service (HttpServlet.java:693) на javax.servlet.http.HttpServlet.service (HttpServlet.java:806) в org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.java: 511) в org.mortbay.jetty.servlet.ServletHandler.handle (ServletHandler.java: 390) в org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java: 216) в org.mortbay.jetty.servlet.SessionHandler.handle (SessionHandler.java: 182) в org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java: 765) в org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java: 418) на org.mortbay.jetty.servlet.Dispatcher.forward (Dispatcher.java:327) на org.mortbay.jetty.servlet.Dispatcher.forward (Dispatcher.java:126) в org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite (NormalRewrittenUrl.java: 195) в org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite (RuleChain.java: 159) в org.tuckey.web.filters.urlrewrite.RuleChain.doRules (RuleChain.java: 141) в org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest (UrlRewriter.java: 90) в org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter (UrlRewriteFilter.java: 417) на org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) в org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal (HiddenHttpMethodFilter.java: 71) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java: 76) на org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) в org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java: 88) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java: 76) на org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) на com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter (ParseBlobUploadFilter.java: 97) на org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) на com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter (SaveSessionFilter.java: 35) на org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) на com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter (TransactionCleanupFilter.java: 43) на org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1157) в org.mortbay.jetty.servlet.ServletHandler.handle (ServletHandler.java: 388) в org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java: 216)в org.mortbay.jetty.servlet.SessionHandler.handle (SessionHandler.java: 182) в org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java: 765) в org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java: 418) на com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle (AppVersionHandlerMap.java: 238) в org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java: 152) на org.mortbay.jetty.Server.handle (Server.java:326) в org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java: 542) на org.mortbay.jetty.HttpConnection $ RequestHandler.headerComplete (HttpConnection.java:923) на com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable (RpcRequestParser.java: 76) на org.mortbay.jetty.HttpConnection.handle (HttpConnection.java:404) на com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest (JettyServletEngineAdapter.java: 135) на com.google.apphosting.runtime.JavaRuntime.handleRequest (JavaRuntime.java: 250) на com.google.apphosting.base.RuntimePb $ EvaluationRuntime $ 6.handleBlockingRequest (RuntimePb.java:5838) на com.google.apphosting.base.RuntimePb $ EvaluationRuntime $ 6.handleBlockingRequest (RuntimePb.java:5836) на com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest (BlockingApplicationHandler.java: 24) на com.google.net.rpc.impl.RpcUtil.runRpcInApplication

Ответы [ 2 ]

1 голос
/ 14 июня 2010

Во-первых, большое спасибо за ответ @ Ника. Здесь я разъясняю ответ более конкретно для моей проблемы на тот случай, если кто-либо, столкнувшийся с такой же проблемой, обратится за помощью.

Кажется, с возможной последовательностью вы не можете сделать запрос, по крайней мере, запрос по ключу, внутри транзакции , в противном случае будет выдано сообщение об исключении, описанное в моем вопросе. В официальной документации Google App Engine это прямо не указано, но с такими предложениями:

Все операции обновления (создание, обновление, удалить) происходят в основном хранилище. строго последовательное чтение сущности может быть еще одна операция или транзакция позади, так как транзакция применяется после того, как она привержен.

Возможная согласованность может потребоваться для чтения из места хранения, отличного от основного, и может конфликтовать с согласованностью транзакций, поэтому не допускается чтение согласованности в рамках транзакции, как я ее вижу.

Сильная согласованность используется по умолчанию без какой-либо конфигурации. Для собственной проблемы я просто удалил следующую строку в файле persistence.xml (JPA):

<property name="datanucleus.appengine.datastoreReadConsistency" value="EVENTUAL" />

Еще раз спасибо, Ник!

1 голос
/ 13 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...