diff --git a/java/RocksDBSample.java b/java/RocksDBSample.java index b574c23e5146182fb241e9df9ca46cbd7f2dfe8a..3c1c1cc83ab40d3582699a1a51062c2bcc0a736f 100644 --- a/java/RocksDBSample.java +++ b/java/RocksDBSample.java @@ -21,9 +21,10 @@ public class RocksDBSample { String db_path = args[0]; System.out.println("RocksDBSample"); + RocksDB db = null; try { - RocksDB db = RocksDB.open(db_path); + db = RocksDB.open(db_path); db.put("hello".getBytes(), "world".getBytes()); byte[] value = db.get("hello".getBytes()); System.out.format("Get('hello') = %s\n", @@ -67,13 +68,11 @@ public class RocksDBSample { assert(len == RocksDB.NOT_FOUND); len = db.get(testKey, enoughArray); assert(len == testValue.length); - try { - db.close(); - } catch (IOException e) { - System.err.println(e); - } } catch (RocksDBException e) { System.err.println(e); } + if (db != null) { + db.close(); + } } } diff --git a/java/org/rocksdb/RocksDB.java b/java/org/rocksdb/RocksDB.java index 7e96eff283b55279861b4836b1df878241153074..7b5f80beba0b89416550807825991cf6cb783ebc 100644 --- a/java/org/rocksdb/RocksDB.java +++ b/java/org/rocksdb/RocksDB.java @@ -16,7 +16,7 @@ import java.io.IOException; * All methods of this class could potentially throw RocksDBException, which * indicates sth wrong at the rocksdb library side and the call failed. */ -public class RocksDB implements Closeable { +public class RocksDB { public static final int NOT_FOUND = -1; /** * The factory constructor of RocksDB that opens a RocksDB instance given @@ -33,8 +33,8 @@ public class RocksDB implements Closeable { return db; } - @Override public void close() throws IOException { - if (nativeHandle != 0) { + public synchronized void close() { + if (nativeHandle_ != 0) { close0(); } } @@ -80,11 +80,15 @@ public class RocksDB implements Closeable { return get(key, key.length); } + @Override protected void finalize() { + close(); + } + /** * Private constructor. */ private RocksDB() { - nativeHandle = -1; + nativeHandle_ = 0; } // native methods @@ -99,5 +103,5 @@ public class RocksDB implements Closeable { byte[] key, int keyLen) throws RocksDBException; private native void close0(); - private long nativeHandle; + private long nativeHandle_; } diff --git a/java/rocksjni/portal.h b/java/rocksjni/portal.h index d51ea2059cc900cc4be18fd570cc1d83d8c06675..d277460c5f1eb377b88ecab218efc06c453a15e4 100644 --- a/java/rocksjni/portal.h +++ b/java/rocksjni/portal.h @@ -29,7 +29,7 @@ class RocksDBJni { // that stores the pointer to rocksdb::DB. static jfieldID getHandleFieldID(JNIEnv* env) { static jfieldID fid = env->GetFieldID( - getJClass(env), "nativeHandle", "J"); + getJClass(env), "nativeHandle_", "J"); assert(fid != nullptr); return fid; } diff --git a/java/rocksjni/rocksjni.cc b/java/rocksjni/rocksjni.cc index 3ae53834eeef7601f359f059a4d4d3de729600f7..d43fa5719a02514b29b3294bbce78a0691251030 100644 --- a/java/rocksjni/rocksjni.cc +++ b/java/rocksjni/rocksjni.cc @@ -147,6 +147,7 @@ jint Java_org_rocksdb_RocksDB_get___3BI_3BI( env->ReleaseByteArrayElements(jvalue, value, JNI_ABORT); return kNotFound; } else if (!s.ok()) { + env->ReleaseByteArrayElements(jvalue, value, JNI_ABORT); // Here since we are throwing a Java exception from c++ side. // As a result, c++ does not know calling this function will in fact // throwing an exception. As a result, the execution flow will @@ -164,10 +165,7 @@ jint Java_org_rocksdb_RocksDB_get___3BI_3BI( memcpy(value, cvalue.c_str(), length); env->ReleaseByteArrayElements(jvalue, value, JNI_COMMIT); - if (cvalue_len > length) { - return static_cast(cvalue_len); - } - return length; + return static_cast(cvalue_len); } /*