Skip to content

Commit 360c0cb

Browse files
committed
[FLINK-30371] Fixed a Problem in the Exception Handling of the Close Method.
This Problem leads to Connection Leaks if some problem occurs.
1 parent e3c52a4 commit 360c0cb

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

flink-connector-jdbc/src/main/java/org/apache/flink/connector/jdbc/internal/JdbcOutputFormat.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ public synchronized void close() {
262262
flush();
263263
} catch (Exception e) {
264264
LOG.warn("Writing records to JDBC failed.", e);
265-
throw new RuntimeException("Writing records to JDBC failed.", e);
265+
flushException = e;
266266
}
267267
}
268268

flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/JdbcTestFixture.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class JdbcTestFixture implements DerbyTestBase {
4444
public static final String OUTPUT_TABLE = "newbooks";
4545
public static final String OUTPUT_TABLE_2 = "newbooks2";
4646
public static final String OUTPUT_TABLE_3 = "newbooks3";
47+
public static final String OUTPUT_TABLE_4 = "newbooks4";
4748
public static final String WORDS_TABLE = "words";
4849
public static final String SELECT_ALL_BOOKS = "select * from " + INPUT_TABLE;
4950
public static final String SELECT_ID_BOOKS = "select id from " + INPUT_TABLE;
@@ -189,6 +190,7 @@ public static void initSchema(DatabaseMetadata metadata) throws SQLException {
189190
createTable(conn, OUTPUT_TABLE);
190191
createTable(conn, OUTPUT_TABLE_2);
191192
createTable(conn, OUTPUT_TABLE_3);
193+
createTable(conn, OUTPUT_TABLE_4);
192194
createWordsTable(conn);
193195
}
194196
}
@@ -232,6 +234,7 @@ public static void cleanUpDatabasesStatic(DatabaseMetadata dbMetadata) throws SQ
232234
stat.executeUpdate("DROP TABLE " + OUTPUT_TABLE);
233235
stat.executeUpdate("DROP TABLE " + OUTPUT_TABLE_2);
234236
stat.executeUpdate("DROP TABLE " + OUTPUT_TABLE_3);
237+
stat.executeUpdate("DROP TABLE " + OUTPUT_TABLE_4);
235238
stat.executeUpdate("DROP TABLE " + WORDS_TABLE);
236239
}
237240
}

flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/internal/JdbcTableOutputFormatTest.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.flink.api.java.tuple.Tuple2;
2424
import org.apache.flink.connector.jdbc.JdbcDataTestBase;
2525
import org.apache.flink.connector.jdbc.JdbcExecutionOptions;
26+
import org.apache.flink.connector.jdbc.JdbcRowOutputFormat;
2627
import org.apache.flink.connector.jdbc.internal.connection.SimpleJdbcConnectionProvider;
2728
import org.apache.flink.connector.jdbc.internal.executor.JdbcBatchStatementExecutor;
2829
import org.apache.flink.connector.jdbc.internal.options.InternalJdbcConnectionOptions;
@@ -34,6 +35,7 @@
3435
import org.junit.jupiter.api.Test;
3536
import org.mockito.Mockito;
3637

38+
import java.io.IOException;
3739
import java.sql.Connection;
3840
import java.sql.DriverManager;
3941
import java.sql.PreparedStatement;
@@ -44,9 +46,7 @@
4446
import java.util.Arrays;
4547
import java.util.List;
4648

47-
import static org.apache.flink.connector.jdbc.JdbcTestFixture.OUTPUT_TABLE;
48-
import static org.apache.flink.connector.jdbc.JdbcTestFixture.TEST_DATA;
49-
import static org.apache.flink.connector.jdbc.JdbcTestFixture.TestEntry;
49+
import static org.apache.flink.connector.jdbc.JdbcTestFixture.*;
5050
import static org.assertj.core.api.Assertions.assertThat;
5151
import static org.mockito.Mockito.doReturn;
5252

@@ -221,6 +221,30 @@ void testJdbcOutputFormat() throws Exception {
221221
check(expected);
222222
}
223223

224+
@Test
225+
public void testExceptionOnFlush() {
226+
JdbcRowOutputFormat jdbcOutputFormat =
227+
JdbcRowOutputFormat.buildJdbcOutputFormat()
228+
.setDrivername(getMetadata().getDriverClass())
229+
.setDBUrl(getMetadata().getJdbcUrl())
230+
.setQuery(String.format(INSERT_TEMPLATE, OUTPUT_TABLE_4))
231+
.setBatchSize(2)
232+
.finish();
233+
setRuntimeContext(jdbcOutputFormat, true);
234+
try {
235+
jdbcOutputFormat.open(0, 1);
236+
237+
jdbcOutputFormat.writeRecord(toRow(TEST_DATA[1]));
238+
jdbcOutputFormat.writeRecord(toRow(TEST_DATA[1]));
239+
} catch (IOException e) {
240+
try {
241+
jdbcOutputFormat.close();
242+
} catch (Exception e1) {
243+
assertThat(jdbcOutputFormat.getConnection()).isEqualTo(null);
244+
}
245+
}
246+
}
247+
224248
private void check(Row[] rows) throws SQLException {
225249
check(rows, getMetadata().getJdbcUrl(), OUTPUT_TABLE, fieldNames);
226250
}

0 commit comments

Comments
 (0)