キー/値LOB例
次の例では、キー/値APIを使用して、LOB値を書き込んだ後に読み取ります。オブジェクトがアプリケーション内で実際にマテリアライズ化されることはありませんが、かわりに、値がファイルシステムからストアに直接ストリームされることに注意してください。この簡単な例では、ストアからの読取り時に、取得したバイト数を単純にカウントします。
また、この例では最小限の例外ハンドリングのみを示します。本番コードでは、おそらくこの例で拾う例外を単にレポートするよりも多くを実行すると思います。
package kvstore.lobExample;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import oracle.kv.Consistency;
import oracle.kv.Durability;
import oracle.kv.KVStore;
import oracle.kv.KVStoreConfig;
import oracle.kv.KVStoreFactory;
import oracle.kv.Key;
import oracle.kv.RequestTimeoutException;
import oracle.kv.Version;
import oracle.kv.lob.InputStreamVersion;
import oracle.kv.lob.PartialLOBException;
public class LOBKV {
private String[] hhosts = {"localhost:5000"};
public static void main(String args[]) {
LOBKV lobkv = new LOBKV();
lobkv.run(args);
System.out.println("All done.");
}
private void run(String args[]) {
KVStoreConfig kconfig = new KVStoreConfig("kvstore", hhosts);
KVStore kvstore = KVStoreFactory.getStore(kconfig);
// Use key "/test/lob/1.lob" to store the jpeg object.
// Note that we are not using a minor key in this
// example. As required, the final key component
// uses a ".lob" suffix.
final Key key =
Key.createKey(Arrays.asList("test", "lob", "1.lob"));
File lobFile = new File("test.jpg");
try {
FileInputStream fis = new FileInputStream(lobFile);
// The image file is streamed from the filesystem into
// the store without materializing it within the
// application. A medium level of durability is
// used for this put operation. A timeout value
// of 5 seconds is set in which each chunk of the LOB
// must be written, or the operation fails with a
// RequestTimeoutException.
kvstore.putLOB(key, fis,
Durability.COMMIT_WRITE_NO_SYNC,
5, TimeUnit.SECONDS);
// Now read the LOB. It is streamed from the store,
// without materialization within the application code.
// Here, we only count the number of bytes retrieved.
//
// We use the least stringent consistency policy
// available for the read. Each LOB chunk must be read
// within a 5 second window or a RequestTimeoutException
// is thrown.
InputStreamVersion istreamVersion =
kvstore.getLOB(key,
Consistency.NONE_REQUIRED,
5, TimeUnit.SECONDS);
InputStream stream = istreamVersion.getInputStream();
int byteCount = 0;
while (stream.read() != -1) {
byteCount++;
}
System.out.println(byteCount);
} catch (FileNotFoundException fnf) {
System.err.println("Input file not found.");
System.err.println("FileNotFoundException: " +
fnf.toString());
fnf.printStackTrace();
System.exit(-1);
} catch (RequestTimeoutException rte) {
System.err.println("A LOB chunk was either not read or");
System.err.println("not written in the alloted time.");
System.err.println("RequestTimeoutException: " +
rte.toString());
rte.printStackTrace();
System.exit(-1);
} catch (PartialLOBException ple) {
System.err.println("Retrieval (getLOB()) only retrieved");
System.err.println("a portion of the requested object.");
System.err.println("PartialLOBException: " + ple.toString());
ple.printStackTrace();
System.exit(-1);
} catch (IOException e) {
System.err.println("IO Exception: " + e.toString());
e.printStackTrace();
System.exit(-1);
}
}
protected LOBKV() {}
}