Почему не возвращается ошибка при INSERT через пул соединений JDBC, если поля в запросе и базе не соответствуют?

Есть пул соединений (Hikari):

public DataSource(String databaseUrl, String user, String password, int dbPoolSize) {
        DataSource.databaseUrl = databaseUrl;
        DataSource.user = user;
        DataSource.password = password;
        DataSource.dbPoolSize = dbPoolSize;
        ds = new HikariDataSource();
        ds.setUsername(user);
        ds.setPassword(password);
        ds.setMaximumPoolSize(dbPoolSize);
        ds.setPoolName("JPAHikariCP");
        ds.setMaxLifetime(120000);
        ds.setConnectionTimeout(30000);
        ds.setIdleTimeout(30000);
        ds.setMinimumIdle(5);
        if (service.equals(Service.EXPORTER)){
            ds.setJdbcUrl(databaseUrl);
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            ds.setAutoCommit(false);
            ds.setTransactionIsolation(String.valueOf(TRANSACTION_READ_COMMITTED));
            ds.addDataSourceProperty("useUnicode", "yes");
            ds.addDataSourceProperty("characterEncoding", "utf8");
        } else if (service.equals(Service.IMPORTER_POSTGRES)){
            ds.setJdbcUrl(databaseUrl);
            ds.setDriverClassName("org.postgresql.Driver");
        } else if (service.equals(Service.IMPORTER_MSSQL)){
            ds.setDataSourceClassName("com.microsoft.sqlserver.jdbc.SQLServerDataSource");
            ds.addDataSourceProperty("url", databaseUrl);
        } else if (service.equals(Service.IMPORTER_CLICKHOUSE)){
            ds.setValidationTimeout(250);
            ds.setDriverClassName("ru.yandex.clickhouse.ClickHouseDriver");
            ds.setJdbcUrl(databaseUrl);
        }
    }

....

try {
            connection = DataSource.getInstance().getConnection();
            if (service.equals(Service.EXPORTER)){
                statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
                statement.setFetchSize(Integer.MIN_VALUE);
            } else if (service.equals(Service.IMPORTER_MSSQL)) {
                statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
            } else if (service.equals(Service.IMPORTER_CLICKHOUSE) || service.equals(Service.IMPORTER_POSTGRES)) {
                statement = connection.createStatement();
            }

        } catch (SQLException e) {
            log.error(e.getCause());
            Arrays.stream(e.getStackTrace()).map(toString -> "\u001B[31m" + toString + "\u001B[0m").forEach(log::error);
        }

...

public void executeRequest(String request) throws SQLException {
            statement.execute(request);
    }

Выполняю INSERT через

statement.execute(request);

Если подключение к Postgres или Clickhouse и таблица не содержит какое-то поле, возвращается ошибка, как и должно быть.
Если подключение к базе mssql и таблица не содержит какое-то поле, не выдает никакой ошибки, данные в таблицу не попадают. Поведение как при удачном insert.

С чем может быть связана данная проблема, при insert в mssql? Ошибка в конфигурации подключения или проблема на стороне БД?


Ответы (1 шт):

Автор решения: Леонид Дубравский

Проблема заключалась в том, что через один statement.execute(request) передавались запросы с разными операторами (DELETE и INSERT) если первая пачка с DELETE например выполнялась нормально, но последующий INSERT не мог выполниться (должен был вернуть исключение), то поведение транзакции было как при полном успешном выполнении.

В общем лучше INSERT И DELETE выполнять отдельно.

→ Ссылка