Evaluation of the C++ binding to the Oracle Database System Dirk Geppert and Krzysztof Nienartowicz, IT/DB CERN IT Fellow Seminar November 20, 2002
Dirk GeppertIT Fellow Seminar, November 20, Outline Report on work performed during IT/DB fellowship in 2001 Part I: Dirk Functionality tests Part II: Krzysztof Benchmarks and Performance issues Presentations at HEP database project workshops Jan 2002 and Jul IT/DB Oracle tutorials OO database, C++ and Java, 20 Feb
Dirk GeppertIT Fellow Seminar, November 20, Outline Part I Motivation Short intro to OCCI & OTT OTT usage Object models Problems & Improvements Summary & Conclusions
Dirk GeppertIT Fellow Seminar, November 20, Motivation Functionality and flexibility for a persistent event store of HEP data provided (object models & access patterns)? Oracle database OCCI & OTT CERN member of Oracle OCCI beta test program Close contact to Oracle development Oracle Metalink Early releases, access to bug fixes betaApril June (patch set)December betaFebruary betaMarch May (patch set)October 2002
Dirk GeppertIT Fellow Seminar, November 20, Oracle C++ Call Interface: OCCI Oracle C++ Call Interface (API) C++ binding on top of C binding (wrapper): a ‘better OCI’ ANSI C++, STL JDBC like Features: Relational programming -Associative access to Relational Data -SQL DDL, DML, queries, PL/SQL Object programming -Associative & Navigational access to objects Advanced features: thread safety, connection pooling, complex object retrieval, metadata, client-side object cache, …
Dirk GeppertIT Fellow Seminar, November 20, MAPFILE fileCPPFILE fileHFILE file OCCI Source Compiler OCCI libraryLinkerObject fileExecutable OTT INTYPE file SQL DDL Database Server Type Definitions Object Type Translator: OTT
Dirk GeppertIT Fellow Seminar, November 20, OTT standard vs. alternative usage Do not touch x_C, extensions to user class Existing code has to be modified Run OTT once, post-process Customize streamer (readSQL, writeSQL): use transient data members No modifications to existing code, only to OTT generated classes Additional advantage: client memory space Vertex_C x,y,z Vertex PObject C++ Vertex_O x,y,z SQL Vertex_CVertex x,y,z PObject C++ User types (transient) already exist: no modifications wanted
Dirk GeppertIT Fellow Seminar, November 20, Object models Implementation of existing HEP data model Provide typical OM, but: keep it simple test OCCI/OTT functionality Choice: NOMAD RAW & DST Different RAW models (VArray, LOB) Subset of DST (showing all required functionality) Read data from ZEBRA Populate/read event data to/from OracleDB using OCCI successful
Dirk GeppertIT Fellow Seminar, November 20, NOMAD object model
Dirk GeppertIT Fellow Seminar, November 20, NOMAD event display Existing NOMAD DST event display Root GUI reading ZEBRA event store Store events in OracleDB, use OCCI for object retrieval Keep Root GUI OCCI demo for Oracle Open World 2001 in San Francisco
Dirk GeppertIT Fellow Seminar, November 20,
Dirk GeppertIT Fellow Seminar, November 20,
Dirk GeppertIT Fellow Seminar, November 20, Problems & Improvements Problems reported (as bug or enhancement request); some solved, some fixed in future Oracle (minor) releases SQL oNo abstract data types, wait for Oracle 10i OTT Member initialization oset & get inlined oPrivate-Protected members oForward declarations oreadSQL return type (inherited instead of base persistent type) post-process (with set of simple scripts)
Dirk GeppertIT Fellow Seminar, November 20, Problems & Improvements cont’d OCCI VARRAY, LOB and String data types Embedded objects: no destructor called Client side object cache Memory leaks Objects were created on heap, now ‘new with placement’ into cache; embedded objects still on heap Control for cache size oControl for garbage collection considerable progress, would like to extend functionality/API
Dirk GeppertIT Fellow Seminar, November 20, Summary & Conclusions OTT Flexibility & functionality not sufficient for HEP but: generated code can be used as template and easily extended/modified to fit needs OCCI Significant progress during IT/DB beta testing -From Oracle 9.0 to 9.2 (~ 1year) -Oracle contacts (e.g. development) very cooperative Required functionality for HEP persistency is available -Implemented object models are non-trivial -Associative access to relational -Navigational access to database objects Ready to use for e.g. ConditionsDB, LCG catalogs
Dirk GeppertIT Fellow Seminar, November 20, create type ARRAY_O as varray(1000) of number / create type A_O as OBJECT ( n number, a ARRAY_O, p REF A_O) / create table A_T of A_O; insert into A_T values (A_O(0,null,null)); type A_O generate A_C as A SQL OTT C++ A_C Number n Vector a Ref p A PObject SQLOTTOCCI
Dirk GeppertIT Fellow Seminar, November 20, Generated C++ classes class A_C : public oracle::occi::Pobject { private: // attributes … public: // set & get attributes … void *operator new(size_t size); void *operator new(size_t size, void *ctxOCCI_); void *operator new(size_t size, const oracle::occi::Connection * sess, const OCCI_STD_NAMESPACE::string& table); OCCI_STD_NAMESPACE::string getSQLTypeName() const; A_C(); A_C(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { }; static void *readSQL(void *ctxOCCI_); virtual void readSQL(oracle::occi::AnyData& streamOCCI_); static void writeSQL(void *objOCCI_, void *ctxOCCI_); virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);} Persistent Object transient persistent SQL
Dirk GeppertIT Fellow Seminar, November 20, Environment *env=Environment::createEnvironment(Environment::OBJECT); RegisterMappings(env); Connection *conn=env->createConnection(“scott”,”tiger”,””); Statement *stmt=conn->createStatement(); ResultSet *resultSet=stmt->executeQuery(“select REF(t) from a_T t where n=0”); if (ResultSet::DATA_AVAILABLE == resultSet->next()) { Ref ref=resultSet->getRef(1); } conn->commit(); stmt->closeResultSet(resultSet); conn->terminateConnection(conn); Environment::terminateEnvironment(env); Example Session create/modify/delete objects easy to use get a reference
Dirk GeppertIT Fellow Seminar, November 20, Ref ref=resultSet->getRef(1); ref_next=new(conn,”A_T”) A(); ref->setP(ref_next); // forward ref->markModified(); Typical usage Ref ref=resultSet->getRef(1); do { ref->dump(); A *ptr=ref.ptr(); // if needed } while (!((ref=ref->getP()).isNull())); dereference, pin reference pointer Example navigation persistent modify Creating new objects