Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Odtug2011 adf developers make the database work for you

2.444 Aufrufe

Veröffentlicht am

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

Odtug2011 adf developers make the database work for you

  1. 1. ADF Developers – make the database work for you<br />ODTUG Kaleidoscope 2011 – Long Beach, California<br />Luc Bors, AMIS, The Netherlands<br />
  2. 2. Desktop<br />Browser-Based<br />Metadata Services (MDS)<br />Oracle ADF – Role of the Database<br />JSF<br />JSP<br />Office<br />ADFSwing<br />Mobile<br />View<br />ADF Faces<br /> JSF<br />Struts<br />ADF Controller<br />Controller<br />ADF Binding<br />Model<br />Business Services<br />EJB<br />BAM<br />ADFbc<br />Portlets<br />BI<br />BPEL<br />Web Services<br />Java<br />Data Services<br />Database<br />Web Services<br />Legacy Systems<br />Apps Unlimited<br />
  3. 3. “We could also do that in the database”<br />in the database? Huh?<br />RDBMS<br />≈<br />
  4. 4. Design & team that combines strengths of all technologies…<br /><ul><li>Ease and Elegance of Implementation
  5. 5. Functionality (in an affordable way)
  6. 6. Productivity
  7. 7. Performance</li></ul>ADF Controller/<br />ADF Faces<br />ADF Model<br />ADF BC/JPA/WS*<br />Oracle RDBMS<br />
  8. 8. Database Strengths<br />Integrity<br />Fine grained (data) security and auditing<br />Data Retrieval <br />joining tables together, leveraging indexes<br />hierarchical, network-like traversals <br />advanced analytics, historical queries, mining <br />Aggregation and Sorting<br />Complex & Massive Data Manipulation<br />
  9. 9. RDBMS not always exclusively accessed through one Java API<br />SOA, ESB, WebServices<br />Database<br />Batch Bulk Processes<br />Standard Applications<br />LegacyApplications<br />Data Replication & Synchronization<br />
  10. 10. Database Triggers – decorating Data Manipulation<br />Triggers execute before or after Insert, Update or Delete of database records<br />insert, update, delete<br />Before Insert trigger: sal=…<br />Employees<br />
  11. 11. Purpose of triggers<br />Set default values on new records<br />if :new.job=‘SALESMAN’ then :new.comm = 1000<br />Calculate & Derive values upon insert, update or delete<br />Notify third parties of data manipulation<br />Perform complex validation on the data changes applied by the transaction<br />Per Department: Max Salary < 1.8 * Average<br />Per Manager: #subordinates < 15<br />
  12. 12. ADF BC refreshing Entity Objects after triggers have applied new values<br />Entity Object Employee<br />(leveraging: returning <column> into : bind)<br />post<br />Before Insert trigger: sal=…<br />Employees<br />
  13. 13. Aggregation & Rollup<br />Data for reporting purposes can be prepared by database queries<br />Including aggregations(max/min/avg/count/sum)<br />and Sub Totals <br />and Grand Total<br />and String Aggregation<br />
  14. 14. Dynamic Aggregation through Non-conventional use of bind parameters<br />Bind parameters are typically used in the WHERE clause of a SQL query<br />However: they can also be used in the SELECT, ORDER BY and GROUP BY sections<br />A combination of CASE and bind parameters in the GROUP BY can provide interesting options<br />DynamicAggregation<br />
  15. 15. Query for dynamic aggregation<br />
  16. 16. Sub and Grandtotals with Rollup<br />Rollup instructs databaseto aggregate at every levelstarting from the right<br />deptno, job<br />deptno<br />(grand total)<br />Also see:<br />Cube<br />GroupingSets<br />
  17. 17. Leveraging SQL Aggregation to make life easier for the UI developer<br />
  18. 18. Analytical Functions – spreadsheet-style row processing<br />Analytical Functions allow SQL queries to perform inter-row comparison & aggregation<br />For example: in a single query, for each employee<br />show salary rank in department and job<br />show salary difference with colleague next higher in rank (on the list per department)<br />show average salary in the department<br />show csv list of colleagues in department<br />
  19. 19. Analytical Functions - example<br />
  20. 20. Flashback Query<br />select emp.*, dept.dname<br />from emp AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY) <br />, deptwhere emp.deptno = dept.deptno<br />
  21. 21. Show historic situation for selected records<br />
  22. 22. Flashback Versions<br />Retrieve all states each record has been in<br />Every transaction that touched a row left a version of the record<br />Pseudocolumns: xid, operation, start time, end time<br />Use constants minvalueand maxvalueto retrieve all versions<br />Flashback versions make journaling tables redundant<br />
  23. 23. Employee Version-history with Flashback Query<br />
  24. 24. Show change history for a record based on Flashback versions<br />
  25. 25. Embedding Historic Data in ADF Application<br />Where Clause in (read only) ViewObject can include FLASHBACK operators<br />AS OF and VERSIONS BETWEEN<br />Bind parameters can be used to set the point in time or the historic time interval<br />A time selector can be used to visually set the interval<br />Scalar subqueries can be used for ‘in line comparison to a certain point in time’<br />“How much higher/lower is the salary than at the selected date?”<br />
  26. 26. Trees<br />
  27. 27. Trees<br />
  28. 28. ADF Model & Tree Data Binding<br />Create hierarchical relation between multiple ViewObject or (POJO) Collection Bindings<br />Tree Data Retrieval retrieves collections in several steps i.e. multiple queries<br />Data is cached<br />Data is only queried when required (given the expansion level of the tree)<br />Alternatively: have the database do the heavy tree lifting: Database has optimized tree algorithms<br />Starting at any node in the tree or network<br />Drilling down to the specified number of levels<br />Order siblings within parent<br />Indicate leaf and parent nodes; detect cycles<br />
  29. 29. Retrieving Hierarchical data sets with single SQL statements<br />Database has optimized algorithms<br />Starting at any node in the tree or network<br />Drilling down to the specified number of levels<br />Order siblings within parent<br />Indicate leaf and parent nodes; detect cycles<br />EMPID ENAME MGR DEPTNO LEVEL<br />--------------- ---------- ---------- ---------- ----------<br /> 7839 KING 10 1<br /> 7698 BLAKE 7839 30 2<br /> 7499 ALLEN 7698 30 3<br /> 7900 JAMES 7698 30 3<br /> 7654 MARTIN 7698 30 3<br /> 7844 TURNER 7698 30 3<br /> 7521 WARD 7698 30 3<br /> 7782 CLARK 7839 10 2<br /> 7934 MILLER 7782 10 3<br />
  30. 30. Oracle 11g and ANSI SQL for hierarchical query<br />with employees (empno, name, mgr, hierlevel, path) as <br />( select empno, ename, mgr, 1, ename<br /> from emp<br /> where mgr is null<br /> union all<br /> select e.empno, e.ename<br /> , e.mgr, m.hierlevel + 1<br /> , m.path||'/'||e.ename<br /> from emp e<br /> join<br /> employees m<br /> on (m.empno = e.mgr) <br />)<br />select *<br />from employees<br />
  31. 31. Filter-driven querying<br />FilteredEmp<br />
  32. 32. Steps for filter driven querying<br />Determine the values to filter on<br />Create a query to retrieve for all filters<br />Every individual value and the # occurrences<br />The where-clause to apply on the real VO<br />The label for the filter<br />Create a managed bean to apply selected filtersto ViewObject<br />Create page that displays filters and selected dataand handles filter “clicks”<br />
  33. 33. Encapsulate Database specific SQL in a View API<br />Views – for encapsulation of data model, multi-table join, (advanced) SQL hiding, authorization rules<br />Note: a view looks like a table to the client<br />View<br />
  34. 34. The read-only cursor API<br />A Cursor is a reference to a query result set<br />Database can open a cursor for a SQL query<br />And return it to the application to fetch the rows from<br />Cursor == JDBCResultSet<br />A cursor can be nested: containdetails … <br />JDBC ResultSet<br />while rs.next { … }<br />cursor<br />Stored Procedure<br />Departments<br />SQL<br />Employees<br />
  35. 35. Cursor for Master-Detail resultset<br />Stored Procedure<br />
  36. 36. Using Complex Views for Hiding Legacy Data Models<br />
  37. 37. Providing a ‘business object’ API<br />DML API: a View – aided by an Instead Of trigger<br />Insert of one new row inUSERS_VW (e.g. a JPApersist operation) can actually be four new records<br />USER, PERSON, EMAIL_TYPEEMAIL_ADDRESS<br />USERS<br />USERS<br />EMAIL_TYPE<br />Instead Of DML trigger<br />*<br />*<br />PERSONS<br />EMAIL_ADDRESSES<br />*<br />*<br />
  38. 38. Instead of Insert Trigger on USERS_VW (1/2)<br />create or replace trigger handle_insert_users_trg<br />instead of insert on users_vw<br />for each row <br />declare<br /> l_psn_id persons.id%type;<br />begin<br /> insert into persons<br /> ( id, first_name, last_name, address, ...)<br /> values<br /> ( nvl(:new.id, central_seq.nextval),:new.first_name , :new.last_name, :new.address, ...)<br /> returning id into l_psn_id;<br /> insert into user_accounts<br /> ( id, psn_id, username, password)<br /> values<br /> ( central_seq.nextval ,l_psn_id , :new.username , :new.password);<br />
  39. 39. Instead of Insert Trigger on USERS_VW (2/2)<br />... <br /> insert into email_addresses<br /> ( id, psn_id, ete_id, address)<br /> values<br /> ( central_seq.nextval , l_psn_id<br /> , ( select id <br /> from email_types ete <br /> where ete.address_type = :new.primary_email_type ) , :new.primary_email)<br /> ;<br />end handle_insert_users_trg;<br />
  40. 40. Creating a new user<br />User Administration<br />USERS<br />First Name<br />Last Name<br />Molly<br />Warhol<br />Username<br />Password<br />mwarhol<br />******<br />USERS<br />EMAIL_TYPE<br />Instead Of DML trigger<br />Address<br />City<br />1 Slickroad<br />Las Vegas<br />Telephone<br />Mobile<br />5551212<br />43219876<br />*<br />Email<br />Email type<br />mw@un.org<br />Business<br />PERSONS<br />EMAIL_ADDRESSES<br />Activation<br />24-may-2008<br />*<br />*<br />
  41. 41. ADF BC and Complex Views with Instead of Triggers<br />Override the lock method in the ViewObjectImpl<br />Default implementation will attempt select … from <view> for update ofWhich is not allowed on Views with an instead of trigger<br />
  42. 42. Do not do it…More often than required<br />Save on network trips, context switches and tiers to cross<br />Save on ‘reproducing’ same results<br />Web Browser<br /><ul><li>JS data (memory)
  43. 43. Cookies
  44. 44. HTML 5 db</li></ul>Edge Cache<br />JEE Application Server<br />Cache<br />Cluster Fail-Over<br />(Session State)<br />Result Store<br />Write Behind<br />Client Result Cache<br />RDBMS<br />Result Cache<br />Materialized View<br />
  45. 45. The Hollywood Principle: Query ResultSet Change Notification<br />POJO / ADF BC<br />
  46. 46. Cache Refresh triggered by DB<br />Oracle RDBMS invokes Java Listener with event details<br />POJO / ADF BC<br />Register DatabaseChangeNotification<br />SQL query<br />PL/SQL<br />
  47. 47. Shared Application Modules<br />Normal Application Module instances are session level – i.e. not shared across (web) sessions<br />Shared Application Module instances are shared across sessions like an Application Scope Managed Bean<br />Used for Static Data Sets: Look Up Data and Reference Tables<br />Sessions can reuse the data from a shared Application Module without having to access the database<br />And loading the same data in session level memory scope<br />View Accessors can be used to access data in the Shared Application Module’s VOs<br />For example for use in LOVs or Validation Rules<br />
  48. 48. Shared Application Module Instance<br />
  49. 49. Auto Refresh for ViewObjects<br />ViewObjects in a Shared Application Module can be registered for auto refresh<br />Typically such application wide VOs are near-static<br />Whenever the underlying data set changes (in the database), the VO rowset should be refreshed<br />By setting Auto Refresh (to true) for the ViewObject, the VO will be refreshed whenever the database is changed<br />ADF registers the VO query with the Database (11g) Result Set Change Notification mechanism through JDBC<br />Note: the VO should not have an Order By clause nor select a Date column<br />
  50. 50. Steps for auto refresh enabling<br />Create Shared Application Module<br />New application module that is added to list of Application Level instances in the Project properties<br />Create the ViewObject that queries the ‘static data’ and add to Shared Application Module<br />Set the Auto Refresh property to true for VO instance<br />Database must be 11g (and have parameter compatible set to 11.1.0 or above)<br />database user must have the Change Notification privilege<br />To piggyback changes to page, set changeEventPolicy to autoPPR on data binding<br />
  51. 51. Set Auto Refresh for ViewObject<br />Set Auto Refresh for ViewObject<br />Grant Change Notification todatabase user<br />
  52. 52. Demo<br />DBQRCN<br />
  53. 53. Reaching out from the database<br />Database<br />
  54. 54. Email conversations<br />
  55. 55. Database receiving and sending emails – from people or applications<br />
  56. 56. RESTful resource navigation<br />
  57. 57. RESTful architecture<br />http<br />http<br />http<br />RESTful PL/SQL APIexposed through dbms_epg<br />
  58. 58. JEE Application Server<br />Enterprise Service Bus<br />ADF Application<br />Web Service<br />?<br />Database informing and leveraging the middle tier<br />HTTP calls using the UTL_HTTP package<br />
  59. 59. Asynchronous processing<br />Execute stored procedures or command scripts (O/S) in the background – using a job<br />Free up the synchronous thread<br />Return control to invoking Java application<br />Ideal for Fire-and-Forget (one way) calls<br />Results can be returned asynchronously<br />Via Queue, Table, Database Query Result Change Notification, HTTP call, Email,…<br />Create a Job in the Oracle Database using:<br />package dbms_scheduler<br />
  60. 60. Other Database Features worth investigating <br />Virtual Private Database & Fine Grained Authorization<br />XMLType, XMLDB & FTP/HTTP/WEBDAV server<br />Object Types and Collections<br />Data type Interval & Time Zone support<br />Fine Grained Auditing<br />System Triggers, for example “after logon”<br />(Global) Application Context<br />Autonomous Transaction<br />Advanced Queuing (& JMS interaction)<br />Creating advanced job execution schedules<br />Edition Based Redefinition (versioning of database objects)<br />Statistics and Data Mining<br />Scalar Subqueries<br />
  61. 61. Summary & Conclusions<br />Databases can do much more than<br />ADF applications can benefit!<br />Strike the right balance:<br />Leverage database forwhat it can do best<br />Make ADF and Database work together in a smooth way<br />