Skip to content

Commit c9501be

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: #101
1 parent 6fc1ea6 commit c9501be

18 files changed

+1177
-266
lines changed

CMakeLists.txt

+3-2
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ set(DUCKDB_SRC_FILES
438438
src/duckdb/extension/json/json_serializer.cpp
439439
src/duckdb/ub_extension_json_json_functions.cpp)
440440

441-
set(JEMACLLOC_SRC_FILES
441+
set(JEMALLOC_SRC_FILES
442442
src/duckdb/extension/jemalloc/jemalloc_extension.cpp
443443
src/duckdb/extension/jemalloc/jemalloc/src/jemalloc.c
444444
src/duckdb/extension/jemalloc/jemalloc/src/arena.c
@@ -552,13 +552,14 @@ add_jar(duckdb_jdbc_tests ${JAVA_TEST_FILES} INCLUDE_JARS duckdb_jdbc)
552552
if(MSVC)
553553
list(APPEND DUCKDB_SRC_FILES duckdb_java.def)
554554
else()
555-
list(APPEND DUCKDB_SRC_FILES ${JEMACLLOC_SRC_FILES})
555+
list(APPEND DUCKDB_SRC_FILES ${JEMALLOC_SRC_FILES})
556556
endif()
557557

558558
add_library(duckdb_java SHARED
559559
src/jni/config.cpp
560560
src/jni/duckdb_java.cpp
561561
src/jni/functions.cpp
562+
src/jni/holders.cpp
562563
src/jni/refs.cpp
563564
src/jni/types.cpp
564565
src/jni/util.cpp

CMakeLists.txt.in

+4-2
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,14 +95,16 @@ 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
107+
src/jni/types.cpp
106108
src/jni/util.cpp
107109
${DUCKDB_SRC_FILES})
108110

duckdb_java.def

+1
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

+1
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

+1
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)