Skip to content

Commit bc6b233

Browse files
committed
Synchronize access to Connection, Statement and ResultSet
This change adds synchronization between accessing and deleting underlying native objects for `Connection`, `Statement` and `ResultSet`. All synchronization is done in JNI part, Java-level synchronization is removed from a few places where it was used. `volatile` fields are added when checking whether the object is closed or not. `Connection`'s underlying native object maintains a list of `Statement`s currently open on this `Connection`. These statements are closed when the connection is closed. Running queries are cancelled (interrupted) automatically when the `Connection` is closed. Note: `Statement.close()` is blocked if a long query, that was started from this statement, is still running. `Statement.cancel()` must be called manually before calling `close()` to perform the closing promptly. This cannot be done automatically, because `cancel()` is implemented in the engine as a `Connection`-level operation, thus calling `cancel()` on a `Statement` can interrupt the query running on another `Statement` on the same `Connection`. Synchronization for `Appender` is going to be added in a separate PR. Testing: new tests added for various sequential and concurrent closure scenarios. Fixes: duckdb#101
1 parent a3a6b3f commit bc6b233

18 files changed

+1181
-268
lines changed

CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ set(DUCKDB_SRC_FILES
439439
src/duckdb/extension/json/json_serializer.cpp
440440
src/duckdb/ub_extension_json_json_functions.cpp)
441441

442-
set(JEMACLLOC_SRC_FILES
442+
set(JEMALLOC_SRC_FILES
443443
src/duckdb/extension/jemalloc/jemalloc_extension.cpp
444444
src/duckdb/extension/jemalloc/jemalloc/src/jemalloc.c
445445
src/duckdb/extension/jemalloc/jemalloc/src/arena.c
@@ -553,13 +553,14 @@ add_jar(duckdb_jdbc_tests ${JAVA_TEST_FILES} INCLUDE_JARS duckdb_jdbc)
553553
if(MSVC)
554554
list(APPEND DUCKDB_SRC_FILES duckdb_java.def)
555555
else()
556-
list(APPEND DUCKDB_SRC_FILES ${JEMACLLOC_SRC_FILES})
556+
list(APPEND DUCKDB_SRC_FILES ${JEMALLOC_SRC_FILES})
557557
endif()
558558

559559
add_library(duckdb_java SHARED
560560
src/jni/config.cpp
561561
src/jni/duckdb_java.cpp
562562
src/jni/functions.cpp
563+
src/jni/holders.cpp
563564
src/jni/refs.cpp
564565
src/jni/types.cpp
565566
src/jni/util.cpp

CMakeLists.txt.in

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ set(DUCKDB_DEFINITIONS
4646
set(DUCKDB_SRC_FILES
4747
${SOURCES})
4848

49-
set(JEMACLLOC_SRC_FILES
49+
set(JEMALLOC_SRC_FILES
5050
${JEMALLOC_SOURCES})
5151

5252

@@ -95,13 +95,14 @@ add_jar(duckdb_jdbc_tests ${JAVA_TEST_FILES} INCLUDE_JARS duckdb_jdbc)
9595
if(MSVC)
9696
list(APPEND DUCKDB_SRC_FILES duckdb_java.def)
9797
else()
98-
list(APPEND DUCKDB_SRC_FILES ${JEMACLLOC_SRC_FILES})
98+
list(APPEND DUCKDB_SRC_FILES ${JEMALLOC_SRC_FILES})
9999
endif()
100100

101101
add_library(duckdb_java SHARED
102102
src/jni/config.cpp
103103
src/jni/duckdb_java.cpp
104104
src/jni/functions.cpp
105+
src/jni/holders.cpp
105106
src/jni/refs.cpp
106107
src/jni/types.cpp
107108
src/jni/util.cpp

duckdb_java.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1get_1auto_1commit
3434
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1get_1catalog
3535
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1get_1schema
3636
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1interrupt
37+
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1is_1result_1open
3738
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1prepare
3839
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1prepared_1statement_1meta
3940
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1query_1result_1meta

duckdb_java.exp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ _Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1get_1auto_1commit
3131
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1get_1catalog
3232
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1get_1schema
3333
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1interrupt
34+
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1is_1result_1open
3435
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1prepare
3536
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1prepared_1statement_1meta
3637
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1query_1result_1meta

duckdb_java.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ DUCKDB_JAVA {
3333
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1get_1catalog;
3434
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1get_1schema;
3535
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1interrupt;
36+
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1is_1result_1open;
3637
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1prepare;
3738
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1prepared_1statement_1meta;
3839
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1query_1result_1meta;

0 commit comments

Comments
 (0)