Как я могу наиболее эффективно загружать изображения из базы данных PostgreSQL с помощью SpringBoot и React

#java #reactjs #spring

#java #reactjs #spring

Вопрос:

Я сохраняю изображение, которое загружается в серверную часть Spring с помощью React, в базе данных PostgreSQL как тип bytea . Ну, если я считываю изображение или несколько за раз, я получаю массив из многих байтов. Является ли это наиболее эффективным решением для загрузки изображений из PostgreSQL и отображения их в React? Потому что с несколькими изображениями может случиться так, что вам придется ждать 4s (около 15 изображений).

Я не получаю сообщение об ошибке, все дело в производительности

введите описание изображения здесь

Мой JavaCode:

 ...
 while (rs.next()) {



                        JSONObject obj = new JSONObject();

                        for (int i = 1; i < intRS   1; i  ) {


                               String column_name = meta.getColumnName(i);


                               switch (meta.getColumnType(i)) {

                               case 2003:

                                     obj.put(column_name, rs.getArray(column_name));

                                     break;

                               case -5:

                                     obj.put(column_name,

                                                 rs.getInt(column_name) == 0 ? JSONObject.NULL : rs.getInt(column_name));

                                     break;

                               case 16:

                                     obj.put(column_name, rs.getBoolean(column_name));

                                     break;

                               case 2004:

                                     obj.put(column_name,

                                                 rs.getBlob(column_name) == null ? JSONObject.NULL : rs.getBlob(column_name));

                                     break;

                               case 8:

                                     obj.put(column_name,

                                                 rs.getDouble(column_name) == 0 ? JSONObject.NULL : rs.getDouble(column_name));

                                     break;

                               case 6:

                                     obj.put(column_name,

                                                 rs.getFloat(column_name) == 0 ? JSONObject.NULL : rs.getFloat(column_name));

                                     break;

                               case 4:

                                     obj.put(column_name,

                                                 rs.getInt(column_name) == 0 ? JSONObject.NULL : rs.getInt(column_name));

                                     break;

                               case -9:

                                     obj.put(column_name,

                                                 rs.getNString(column_name) == null ? JSONObject.NULL : rs.getNString(column_name));

                                     break;

                               case 12:

                                     obj.put(column_name,

                                                 rs.getString(column_name) == null ? JSONObject.NULL : rs.getString(column_name));

                                     break;

                               case -6:

                                     obj.put(column_name,

                                                 rs.getInt(column_name) == 0 ? JSONObject.NULL : rs.getInt(column_name));

                                     break;

                               case 5:

                                     obj.put(column_name,

                                                 rs.getInt(column_name) == 0 ? JSONObject.NULL : rs.getInt(column_name));

                                     break;

                               case 91:

                                     obj.put(column_name,

                                                 rs.getDate(column_name) == null ? JSONObject.NULL : rs.getDate(column_name));

                                     break;

                               case 93:

                                     obj.put(column_name, rs.getTimestamp(column_name) == null ? JSONObject.NULL

                                                  : rs.getTimestamp(column_name));

                                     break;

                               default:



                                     obj.put(column_name,

                                                 rs.getObject(column_name) == null ? JSONObject.NULL : rs.getObject(column_name));

                                     break;

                               }



                        }

  ArrayJS.put(obj);
}
  

И я в своем коде React сопоставляю JSONArray, поступающий из моего бэкэнда, и форматирую массив изображений следующим образом:

 var img = atob(arrayBufferToBase64(data.Projektbild));
  

Комментарии:

1. Вы отправляете двоичные данные в формате JSON. Двоичные данные должны отправляться как двоичные, в противном случае ваше байтовое значение 100 занимает 3 байта вместо 1. Не говоря уже о ненужной сериализации и десериализации данных JSON.

Ответ №1:

Для больших двоичных данных обычно намного быстрее хранить данные в файловой системе (или хранилище объектов, например S3) и сохранять ссылку в базе данных.

Комментарии:

1. @ dssjoblom Это невозможно, поскольку приложение работает в облаке

2. Но у вас нет места на диске в вашем облаке?

3. Я использую Pivotal в качестве службы PaaS

4. @schorle88 Я не использовал Pivotal, но см., Например, Здесь: docs.pivotal.io/application-service/2-10/operating /…

5. @dssjoblom Хорошо, я посмотрю, спасибо. Но это лучшее решение? Я имею в виду, что я также хочу обновлять, удалять и т. Д. Изображения.