420 likes | 438 Views
Learn how to migrate C++ applications to Oracle using the Oracle C++ Call Interface (OCCI). Explore object orientation in C++, Oracle C++ Call Interface overview, object access, and case studies.
E N D
Bernhard DüchtingPrincipal Sales Consultant BU Database - Migration Oracle Germany
Agenda • Object Orientation and C++ • Oracle C++ Call Interface - Overview • Objects Access • Summary • Case Study - Using OCCI at CERN • Q & A
Object Orientation with 9i • Native data types for collections • Definition of object types, object tables and object views • Explicit table inheritance using SQL-99 • Implicit inheritance using references (REF) • Overloading of object methods • Online schema evolution
Object Orientation and C++ • Header files with object definition generated from object schema • No need for separate object-relational mapping • Object cache with pre-fetch capability for transient and persistent object management • Server-side object locking
Steps for Migration • Determine object model and class hierarchy • Use JDeveloper 9i to map to Oracle object schema • Generate C++ header files using Oracle Type Translater (OTT) • Modify old C++ access classes as required to work with new object type definitions • Add functionality for transient and persistent object management as required
OCCI Partners and Customers • A major GIS cartridge partner • High performance object-relational and spatial data access for national surveying system • A global power transmission manufacturer • Handle complex object-retrieval for graphical maintenance console • A global medical systems manufacturer • Replace ODBMS to manage patient image data • A national postal authority • Replacing third-party persistency framework
Agenda • Object Orientation and C++ • Oracle C++ Call Interface - Overview • Objects Access • Summary • Case Study - Using OCCI at CERN • Q & A
Oracle C++ Call Interface OCCI • Built on OCI • Similar control and performance of OCI • Based on Standards • ANSI/ISO C++ Standard, including STL • Associative access API design similar to JDBC • Performance • Prefetching, client-side cache, array operations, data buffering, thread safe • API easy to use • API design consistent with C++ programming paradigm (e.g. new operator overloaded for creating persistent objects)
OCCI Basics • Setup of Environment and Connection • Executing SQL Statement • SQL statement • Prepared SQL statement with bind variables • Stored procedure • Executing SQL Query • Return multiple rows into result set • Use prefetching for performance • Seamless support of Oracle datatypes • varchar2 mapped to string, • collection mapped to vector STL
OCCI Advanced Features • Connection Pooling • Improves scalability by multiplexing many logical connections over few physical connections • Optimal usage of physical connection resource • Connection pool shrinks and grows on demand • Thread Safety • OCCI handles mutexed access to shared resources • Array Operations • Insert/update multiple rows • Fetch multiple rows in one round-trip
Example Session 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 atable t where n=0”); if (ResultSet::DATA_AVAILABLE == resultSet->next()) { Ref<mytype> ref=resultSet->getRef(1); } conn->commit(); stmt->closeResultSet(resultSet); conn->terminateConnection(conn); Environment::terminateEnvironment(env); create/modify/delete objects
Agenda • Object Orientation and C++ • Oracle C++ Call Interface - Overview • Objects Access • Summary • Case Study - Using OCCI at CERN • Q & A
OCCI Object Features • Transparent access of database objects as C++ instances • Navigation of objects as simple as de-referencing smart-pointers • Client-side caching of C++ objects • Supports all 9i object features including inheritance • Oracle Type Translator (OTT) • Maps object types to C++ interface classes
Client-side Object Cache • Memory Buffer for Objects • Transparent lookup and memory management support • Stores and tracks objects fetched from server to client side • Maintains references • Created when OCCI environment is initialized in object mode • Benefits • Reduces client/server round-trips • Object-level locking
Accessing Objects • Unique Object Identifier OID • Navigational Interface • No SQL • Navigate using object references (REF) • Create/access/lock/delete/flush/commit • Associative Interface • Use SQL or PL/SQL • Data buffers, no cost of transporting data to client
Representing Objects CREATE TYPE ADDRESS AS OBJECT ( state CHAR(2), zip CHAR(2)); • OTT generates: class ADDRESS : public PObject { // OCCI pre-defined class protected : string state; string zip; public : void *operator new(size_t size); // create a transient instance void *operator new(size_t size, Connection *conn, string& table); // create a persistent instance }
Working with Objects I • Create new object • Use new operator • Transient or persistent objects • Fetch object from server • Pin object in cache using REF • Fetch object by value • Navigate to object • Use pinned object to traverse hierarchy • Only with referenceable objects
Working with Objects II • Modify object • Make changes in C++ application • Mark persistent object as dirty • Flush changes to server • Commit transaction • Includes flushing dirty objects
Oracle Object Cache Clientside cache Server buffer cache REF flush load Pin Network
Agenda • Object Orientation and C++ • Oracle C++ Call Interface - Overview • Objects Access • Summary • Case Study - Using OCCI at CERN • Q & A
Summary I • Oracle C++ Call Interface OCCI • Simple and easy • High-performance and Scalable API • Comprehensive support of Oracle Database features • Ideal choice for implementing high performance mid-tier applications • 9i Release 2 focus on performance
Summary II • Easy migration of C++ applications • Determine UML class model • Import into Jdeveloper 9i • Re-model as required • Generate Oracle 9i object schema • Generate C++ header files with OTT • Modify C++ persistency classes as required
Agenda • Object Orientation and C++ • Oracle C++ Call Interface - Overview • Objects Access • Summary • Case Study - Using OCCI at CERN • Q & A
C A S E S T U D Y Using OCCI at CERN
Overview • Brief introduction to CERN & LHC • Huge data volumes, long lifetime, Use of OO • Extensive experience with databases • Oracle since 1982; ODBMS since 1995 • Migration of existing applications • Complex C++ programs; • Up to 1000 classes; • Many KLOC - MLOC
Data R A W E S D A O D TAG 1TB/yr 10TB/yr 100TB/yr Tier1 1PB/yr (1PB/s prior to reduction!) Tier0 random seq. Users
Overview • Brief introduction to CERN & LHC • Huge data volumes, long lifetime, OO • Extensive experience with databases • Oracle since 1982; ODBMS since 1995 • Migration of existing applications • Complex C++ programs; • Up to 1000 classes; • Many KLOC - MLOC
CERN & Databases • Oracle brought in for construction of previous accelerator • 1982; LEP – 27km ring 100m underground • Now pervasive through-out work of lab • Early 1990s: move to object orientated approach for “physics applications” • Extensive experience with Object Databases • Until end 2001, baseline choice for multi-PB requirements of LHC • Production experience with ODBMS up to ~100TB • cf SLAC/BaBar 500TB system • Requirement for LHC: 100PB system (all data)
Overview • Brief introduction to CERN & LHC • Huge data volumes, long lifetime, OO • Extensive experience with databases • Oracle since 1982; ODBMS since 1995 • Migration of existing applications • Complex C++ programs; • Up to 1000 classes; • Many KLOC – MLOC • Exploit associative and navigational access
OCCI / OTT Functionality • CERN has worked closely with Oracle since prior to Oracle 9i announcement on OCCI/OTT functionality, interfaces, implementation etc • Active partner in 9iR1 & 9iR2 Beta program • Happy to confirm that required functionality & product stability are available in 9iR2
Migration of Existing Apps (I) • Detector Conditions Database • Previously implemented on ODBMS • Same user interface re-implemented using OCCI • Client based on associative access • No changes to user code! (Except connect string) • Complete re-design of underlying data model • Implemented using pure relational model • Uses partitioned tables; materialized views; stored procedures; indexes; … • One of several applications for production 9iRAC service being setup at CERN • Other similar applications foreseen • Grid replica catalogue, production control DB, …
Migration of Existing Apps (II) • Take existing large C++ application • Strip out ODBMS-based persistency layer • Replace with OCCI using navigational access • Strong requirements from both user & developer point of view: • C++ Developer: • No change to object model & classes • User: • No change to application
Functionality tests (I) Tests of basic components • Simple objects • Compound objects • Contain other user types as attributes • Inheritance • Composition by reference • Collections by value & reference (II) Full object models • Exploits all above features • Stresses client-side object cache & navigation
CMS Migration • Independent module developed to handle DB interface • Oracle or ODBMS • Modification of the application and the implementation of the independent module totaled several hundreds of lines of code • No other code was modified! • From user application level … users are not aware of the change
Conclusions • OCCI offers powerful persistency mechanisms for C++ applications • Both associative & navigational access supported • Full power of database still available • Significant benefit over conventional ODBMS • Migration of complex applications proven • Achieved with no change to user code
Q & Q U E S T I O N S A N S W E R S A