У меня работает базовая настройка персистентности Ignite.Пока это один узел, работающий в режиме сервера, с которого я подключаю двух клиентов.Когда я вставляю данные через SQL от одного из этих клиентов («Клиент 1» ниже), я могу ВЫБРАТЬ их снова с помощью SQL и получить результаты обратно.Из приведенного ниже «Клиента 2», когда я пытаюсь получить кеш, который должен быть создан для представления этой таблицы, он равен null.
Сервер запускает образ apacheignite, используя следующий файл Docker:
server / Dockerfile:
FROM apacheignite/ignite
# for jdbc connection
EXPOSE 10800
EXPOSE 47100-47109
EXPOSE 47500-47509
# for rest api
EXPOSE 8080
WORKDIR /app
COPY ./config /app/config
RUN mv /opt/ignite/apache-ignite/libs/optional/ignite-aws /opt/ignite/apache-ignite/libs/
RUN mv /opt/ignite/apache-ignite/libs/optional/ignite-rest-http /opt/ignite/apache-ignite/libs/
CMD /opt/ignite/apache-ignite/bin/ignite.sh /app/config/ignite-config.xml -v
Соответствующие части ignite-config.xml
, упомянутые здесь, выглядят следующим образом:
/ app / config / ignite-config.xml
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<property name="defaultDataRegionConfiguration">
<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
<property name="persistenceEnabled" value="true"/>
</bean>
</property>
</bean>
</property>
<property name="discoverySpi">
<bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
<property name="ipFinder">
<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
<property name="addresses">
<list>
<value>127.0.0.1:47500..47509</value>
</list>
</property>
</bean>
</property>
</bean>
</property>
</bean>
Я также удостоверился, что активировал кластер в контейнере сервера, используя, поскольку Persistence по умолчанию устанавливает кластер в неактивное состояние.
/opt/ignite/apache-ignite/bin/control.sh --activate
Клиент 1
Клиент 1 подключается черезТонкий драйвер JDBC и делает некоторые CREATE TABLE
с и INSERT
с.Когда я позже SELECT
в чем-то вроде DBeaver, я вижу эти данные.
Этот клиент также работает в Docker, наряду с другим в Compose.Все, что он делает, - это вызывает в цикле следующее, где $file
- это файл SQL, содержащий CREATE TABLE
, INSERT
s и т. Д.
/opt/ignite/apache-ignite/bin/sqlline.sh -u jdbc:ignite:thin://server:10800 -f $file;
Один из таких файлов SQL выглядит так:
DROP TABLE IF EXISTS attributes;
DROP INDEX IF EXISTS idx_attributes_token;
CREATE TABLE attributes (
token VARCHAR,
attributeId LONG,
name VARCHAR,
PRIMARY KEY(token, attributeId)
) WITH "affinityKey=token";
CREATE INDEX idx_attributes_token ON attributes (token);
INSERT INTO attributes (token, attributeId, name) VALUES ('abc123', 123, 'some name');
Клиент 2
Клиент 2 подключается к Ignite более или менее следующим образом:
IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
ipFinder.setAddresses(igniteConfig.getAddresses()); // will be "localhost:10800" -- I map 10800:10800 when the "Server" container runs
discoverySpi.setIpFinder(ipFinder);
igniteConfiguration.setDiscoverySpi(discoverySpi);
Ignite ignite = Ignition.start(igniteConfiguration);
IgniteCache<Object, String> attributesCache = ignite.cache("SQL_PUBLIC_ATTRIBUTES"); // null
// if i use ignite.getOrCreateCache("SQL_PUBLIC_ATTRIBUTES") instead then of course it's a cache of size 0.
В конечном счете, я хочу иметь возможность захватить этот кеш и использоватьStreamVisitor
, описанный в документации Ignite для выполнения операций над каждым.Якобы это выглядело бы так:
...
IgniteDataStreamer<Object, AttributeWithGroup> attributeStreamer = ignite.dataStreamer(attributesCache.getName());
attributeStreamer.receiver(StreamVisitor.from((cache, entity) -> {
Object key = entity.getKey();
Attribute attribute = entity.getValue();
// do some stuff
}));
... но лямбда никогда не запускается, потому что кеш нулевой.
Почему существует такое различие между тем, что я вижу вSQL и что я вижу в кеше?