Как создать транзакцию между облачным хранилищем Google и исключениями обработки базы данных - PullRequest
0 голосов
/ 04 апреля 2019

При использовании клиента облачного хранилища Google вы можете, например, создать и удалить изображение из хранилища Google.Два метода create и delete не генерируют исключения.Исключением являются, например, проблемы с подключением, которые обрабатываются облачным клиентом Google?

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

Это код, который я использую для создания и обновления URL-адреса изображения в базе данных:

Storage storage = StorageOptions.newBuilder().setCredentials(credentials).setProjectId("project-id").build().getService();

BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType(userImage.getContentType()).build();

UUID uuid = UUID.randomUUID();
String path = uuid.toString();
BlobId blobId = BlobId.of("bucket", path);

try {
    Blob blob = storage.create(blobInfo, userImage.getBytes());
} catch (IOException e) {
    e.printStackTrace();
}

user.setImageUrl("https://storage.googleapis.com/bucket" + path);
this.userRepository.save(user);

Я хочу быть уверен, что создание произошло и что URL-адрес был зафиксированв базу данных при возврате из этой функции.

Я также хотел бы добавить следующее:

При добавлении я хотел бы удалить последнее изображение, используя URL-адрес в базе данных перед обновлением.

Но опять-таки, здесь я хотел бы, чтобы все это происходило или ничего.

И кажется, что я могу создать изображение и не могу сохранить URL-адрес и потерять изображение в Googleместо хранения.То же самое может случиться при удалении.Например, вы удаляете изображение, но затем не можете обновить URL-адрес изображения в базе данных, и у меня будет сломанное изображение, например, во внешнем интерфейсе.

Итак, как я могу реализовать своего рода транзакцию, включая добавление нового изображения и URL-адреса и удаление старого изображения и старого URL-адреса.

Или какой другой механизм, решение можетЯ расследую?Что дают мне это гарантии?

Можете ли вы помочь мне и указать мне правильное направление?

1 Ответ

0 голосов
/ 15 апреля 2019

Действительно, клиент облачного хранилища Google работает с исключениями и возвращает только ноль или фактический BLOB-объект.

Таким образом, идея состоит в том, чтобы сохранить URL-адрес и идентификатор изображения в базе данных и создать изображение в облаке Google.удаление последнего изображения в облачном хранилище Google.(Я просто сохраняю одно изображение для каждого пользователя).

Я придумал следующее.

Вы создаете транзакцию, которая создает запись с новым URL-адресом.

И затем вы создаете изображение в облачном хранилище Google.

Если создание изображения и обновление в базе данных прошло хорошо, все в порядке.

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

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

Я создал задачу, которая периодически запускается и проверяет, есть ли в этой таблице URL-адреса, и запускаю удаление в облачном хранилище Google (gcs).Я также использую транзакцию здесь, потому что вы хотите удалить запись и выполнить удаление в gcs.Если все идет хорошо, в противном случае вы выполняете откат, и в следующий раз, когда вы снова запустите задание, попробуйте снова удалить его.

Вот и все.Если вы думаете, что я мог бы подойти к этому по-другому и лучше, пожалуйста, скажите мне.

...