Зажигайте сквозную запись с помощью преобразования данных серверной части postgres

Я настраиваю Apache Ignite с Postgres в качестве постоянного хранилища. В postgres у меня есть столбцы JSON и Array, поэтому я реализовал собственный преобразователь для преобразования всего, что не является примитивным, в строку JSON. Вот код:

public class PostgresTransformer extends JdbcTypesDefaultTransformer {

    @Override
    public Object getColumnValue(ResultSet rs, int colIdx, Class<?> type) throws SQLException {
        if (type == ArrayOfFloat.class) {
            Array raw = rs.getArray(colIdx);
            ArrayOfFloat obj = new ArrayOfFloat(raw);
            return obj.toString();
        }

        if (type == ArrayOfInt.class) {
            Array raw = rs.getArray(colIdx);
            ArrayOfInt obj = new ArrayOfInt(raw);
            return obj.toString();
        }

        if (type == ArrayOfString.class) {
            Array raw = rs.getArray(colIdx);
            ArrayOfString obj = new ArrayOfString(raw);
            return obj.toString();
        }

        if (type == JSON.class) {
            String raw = rs.getString(colIdx);
            JSON obj = new JSON(raw);
            return obj.toString();
        }

        return super.getColumnValue(rs, colIdx, type);
    }
}

В main-server.xml я также использую эту соответствующую конфигурацию:

<property name="transformer">
     <bean class="com.mycorp.ignite.transformers.PostgresTransformer"/>
</property>

<bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
      <constructor-arg>
            <util:constant static-field="java.sql.Types.OTHER"/>
      </constructor-arg>
      <constructor-arg value="neighbourhood_stats"/>
      <constructor-arg value="com.mycorp.ignite.types.JSON"/>
      <constructor-arg value="neighbourhoodStats"/>
</bean>

Для меня это хорошо подходит для чтения. Мой вопрос: как преобразовать его обратно в действительный тип данных postgres, когда я сохраняю данные обратно в БД через сквозную запись? В трансформаторе нет метода setColumnValue. Только getColumnValue. Спасибо!

0
0
387
1

Ответы 1

Я не думаю, что вам следует использовать CacheJdbcPojoStore в этом случае. Просто создайте свою собственную реализацию интерфейса CacheStore и сделайте там все необходимые преобразования.

Подскажите, пожалуйста, какие методы CacheJdbcPojoStore нужно перезаписать? Я смотрю на него прямо сейчас (org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStore), но не могу найти ничего, связанного с «обратной записью в базу данных».

Sergey Yarotskiy 13.09.2018 21:17

А в CacheStore есть только loadCache, а вот saveCache нет.

Sergey Yarotskiy 13.09.2018 21:23

Интерфейс CacheStore является расширением CacheLoader и CacheWriter, в которых есть все методы для чтения / записи. Обратите внимание, что loadCache предназначен не для чтения, а для начальной предварительной загрузки.

Valentin Kulichenko 14.09.2018 23:46

Другие вопросы по теме