соединение с временной таблицей snowflake с использованием JDBC

Я пытаюсь поместить временные значения во временную таблицу снежинок, используя Mybatis. Сведения о соединении, настроенные в файле server.xml сервера приложений WebSphere.

В идеале значения должны сохраняться на уровне запроса сервера.

Но пока приложение запущено, временная таблица и ее данные остаются доступными. С каждым запросом я могу видеть предыдущие данные вставки.

Тот же код отлично работает для глобальной временной таблицы Oracle.

public class TempDao{

@Inject
SqlSession sqlSession;

public int saveValues(List<TemporaryValue> values) {
        logger.debug("Saving items on temporary table");
        try {
            final Map<String, Object> parameters = new HashMap<>();
            parameters.put("jobList", values);
            return sqlSession.insert("com.some.sql.insertJobs", parameters);
        } catch (Exception e) {
            ExceptionUtils.propagate(e);
        }
        return 0;
    }


}

JNDI-соединение:

<dataSource id="SnowflakeDataSource" jndiName="jdbc/BM_SF" maxPoolSize="100" queryTimeout="300s" statementCacheSize="1000" type="javax.sql.DataSource">
        <properties URL="jdbc:snowflake://adpdc_cdl.us-east-1.privatelink.snowflakecomputing.com" databaseName="***" password="****" schema="**" user="**" warehouse="****strong text**" />
        <jdbcDriver javax.sql.DataSource="net.snowflake.client.jdbc.SnowflakeBasicDataSource" libraryRef="SharedLib"/>
    </dataSource>

person Debrup Majumdar    schedule 09.03.2021    source источник
comment
В чем именно проблема? Временные таблицы Snowflake доступны на период сеанса, в котором они были созданы. Они уничтожаются при завершении сеанса.   -  person Sergiu    schedule 09.03.2021
comment
Да какой у тебя вопрос?   -  person Simon D    schedule 09.03.2021
comment
Даже если я закрываю соединение JDBC после завершения запроса, временная таблица не уничтожается. Если я не перезапущу свой сервер приложений. Есть ли еще какие-то настройки, которые нужно сделать, или я что-то упускаю?   -  person Debrup Majumdar    schedule 09.03.2021
comment
Как вы закрываете соединение JDBC, можете ли вы привести пример?   -  person Sergiu    schedule 09.03.2021
comment
похоже, что у вас есть пул соединений в вашем коде, поэтому сеанс используется повторно (для экономии времени установки соединения), и поэтому ваша временная таблица живет дольше, чем вы ожидаете.   -  person Simeon Pilgrim    schedule 09.03.2021
comment
Да, идентификатор сеанса БД одинаков для всех соединений в пуле соединений. Кажется, какая-то проблема с JDBC-драйвером Snowflake.   -  person Debrup Majumdar    schedule 10.03.2021


Ответы (1)


В Liberty можно отключить пул соединений, если он мешает завершению сессий в Snowflake. См. элемент connectionManager с agedTimeout равным 0 (немедленный тайм-аут), который я вставил в ваш фрагмент конфигурации,

    <dataSource id="SnowflakeDataSource" jndiName="jdbc/BM_SF" maxPoolSize="100" queryTimeout="300s" statementCacheSize="1000" type="javax.sql.DataSource">
        <connectionManager agedTimeout="0"/>
        <properties URL="jdbc:snowflake://adpdc_cdl.us-east-1.privatelink.snowflakecomputing.com" databaseName="***" password="****" schema="**" user="**" warehouse="****strong text**" />
        <jdbcDriver javax.sql.DataSource="net.snowflake.client.jdbc.SnowflakeBasicDataSource" libraryRef="SharedLib"/>
    </dataSource>
person njr    schedule 10.03.2021
comment
спасибо @njr. Теперь это работает. Но в продакшне отключение пула соединений определенно не лучший вариант. - person Debrup Majumdar; 12.03.2021