javax.jdo.JDOException: файл свойств строки слишком длинный.Не может превышать 1000000 символов - PullRequest
2 голосов
/ 01 марта 2012

Я пытаюсь загрузить небольшой файл TXT (4 КБ) в хранилище данных Google App Engine.Когда я тестирую приложение локально, у меня нет проблем, и файл успешно сохраняется;но когда я пытаюсь в GAE, я получаю следующую ошибку:

javax.jdo.JDOException: string property file is too long.  It cannot exceed 1000000 characters.
NestedThrowables:
java.lang.IllegalArgumentException: string property file is too long.  It cannot exceed 1000000 characters

В консоли GAE журналы говорят следующее:

com.google.apphosting.api.ApiProxy$RequestTooLargeException: The request to API call datastore_v3.Put() was too large.
at com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.success(ApiProxyImpl.java:480)
at com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.success(ApiProxyImpl.java:380)
at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher$1.runInContext(RpcStub.java:746)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)
at com.google.tracing.TraceContext.runInContext(TraceContext.java:695)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)

Отображение JDO объекта, содержащего файлэто следующее:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class AppointmentEntity implements Serializable {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;    
    @Persistent(serialized = "true")
    private DownloadableFile file;

И DownloadableFile это:

public class DownloadableFile implements Serializable {
    private byte[] content;
    private String filename;
    private String mimeType;

Есть идеи, что случилось?Я прочитал кое-что о размере сеанса и размере сущности, но небольшой размер файла заставляет меня отказаться от этих теорий.

1 Ответ

0 голосов
/ 26 апреля 2012

Подумайте о том, чтобы поместить свой маленький файл в хранилище больших двоичных объектов, а затем сохранить ключ хранилища в хранилище данных:

@PersistenceCapable()
public class FileEntity   {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    protected Key key;


    @Persistent
    private BlobKey blobKey;

}




private void createBlobStoreEntity() throws IOException{
        final PersistenceManager pm = PMF.get().getPersistenceManager();
        final FileService fileService = FileServiceFactory.getFileService();
        final AppEngineFile file = fileService.createNewBlobFile(Const.CONTENT_TYPE_PLAIN);
        final String path = file.getFullPath();
        final FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
        PrintWriter out = new PrintWriter(Channels.newWriter(writeChannel, "UTF8"));
        try {

            out.println(txt);
            out.close();
            writeChannel.closeFinally();
            final BlobKey key = fileService.getBlobKey(file);

            final ValueBlobStore store = new
                    FileEntity(key);

            pm.makePersistent(store);
            pm.flush();

        }
        finally {
            out.close();
            pm.close();
        }
    }
...