Recommended Programming Practices
Use the following recommended programming practices.
Use Instrumentation Packages
Oracle AI Database supplies instrumentation packages whose subprograms let your application generate trace information whenever necessary. Using this trace information, you can debug your application without a debugger and identify code that performs badly.
Instrumentation provides your application with considerable functionality; therefore, it is not overhead. Overhead is something that you can remove without losing much benefit.
Some instrumentation packages that Oracle AI Database supplies are:
-
DBMS_APPLICATION_INFO, which enables a system administrator to track the performance of your application by module.
For more information about DBMS_APPLICATION_INFO, see Oracle AI Database PL/SQL Packages and Types Reference.
-
DBMS_SESSION, which enables your application to access session information and set preferences and security levels
For more information about DBMS_SESSION, see Oracle AI Database PL/SQL Packages and Types Reference.
-
UTL_FILE, which enables your application to read and write operating system text files
For more information about UTL_FILE, see Oracle AI Database PL/SQL Packages and Types Reference.
See Also: Oracle AI Database PL/SQL Packages and Types Reference for a summary of PL/SQL packages that Oracle AI Database supplies
Statistics Gathering and Application Tracing
Database statistics provide information about the type of load on the database and the internal and external resources used by the database. To accurately diagnose performance problems with the database using ADDM, statistics must be available.
For information about statistics gathering, see Oracle AI Database Get Started with Performance Tuning.
Note: If Oracle Enterprise Manager is unavailable, you can gather statistics using DBMS_MONITOR subprograms as described in Oracle AI Database PL/SQL Packages and Types Reference.
Oracle AI Database provides several tracing tools that can help you monitor and analyze database applications. For details, see Oracle AI Database SQL Tuning Guide.
Use Existing Functionality
An application that uses existing functionality is easier to develop and maintain than one that does not, and it also runs faster.
When developing your application, use the existing functionality of your programming language, your operating system, Oracle AI Database, and the PL/SQL packages and types that Oracle AI Database supplies as much as possible.
Examples of existing functionality that many developers reinvent are:
-
Constraints
For introductory information about constraints, see “Ensuring Data Integrity in Tables.”
-
SQL functions (functions that are “built into” SQL)
For information about SQL functions, see Oracle AI Database SQL Language Reference.
-
Sequences (which can generate unique sequential values)
-
Auditing (the monitoring and recording of selected user database actions)
For introductory information about auditing, see Oracle AI Database Security Guide.
-
Replication (the process of copying and maintaining database objects, such as tables, in multiple databases that comprise a distributed database system)
For information about replication, see the Oracle GoldenGate documentation..
-
Message queuing (how web-based business applications communicate with each other)
For introductory information about Oracle AI Database Advanced Queuing (AQ), see Oracle AI Database Advanced Queuing User’s Guide.
-
Maintaining a history of record changes
For introductory information about Workspace Manager, see Oracle AI Database Workspace Manager Developer’s Guide.
In Example 8-4, two concurrent transactions dequeue messages stored in a table (that is, each transaction finds and locks the next unprocessed row of the table). Rather than simply invoking the DBMS_AQ.DEQUEUE procedure (described in Oracle AI Database PL/SQL Packages and Types Reference), the example creates a function-based index on the table and then uses that function in each transaction to retrieve the rows and display the messages.
The code in Example 8-4 implements a feature similar to a DBMS_AQ.DEQUEUE invocation but with fewer capabilities. The development time saved by using existing functionality (in this case, function-based indexes) can be large.
Example 8-4 Concurrent Dequeuing Transactions
Create table:
DROP TABLE t;
CREATE TABLE t
( id NUMBER PRIMARY KEY,
processed_flag VARCHAR2(1),
payload VARCHAR2(20)
);
Create index on table:
CREATE INDEX t_idx ON
t( DECODE( processed_flag, 'N', 'N' ) );
Populate table:
INSERT INTO t
SELECT r,
CASE WHEN MOD(r,2) = 0 THEN 'N' ELSE 'Y' END,
'payload ' || r
FROM (SELECT LEVEL r FROM DUAL CONNECT BY LEVEL <= 5);
Show table:
SELECT * FROM t;
Result:
ID P PAYLOAD
---------- - --------------------
1 Y payload 1
2 N payload 2
3 Y payload 3
4 N payload 4
5 Y payload 5
5 rows selected.
First transaction:
DECLARE
l_rec t%ROWTYPE;
CURSOR c IS
SELECT *
FROM t
WHERE DECODE(processed_flag,'N','N') = 'N'
FOR UPDATE
SKIP LOCKED;
BEGIN
OPEN c;
FETCH c INTO l_rec;
IF ( c%FOUND ) THEN
DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
END IF;
CLOSE c;
END;
/
Result:
Got row 2, payload 2
Concurrent transaction:
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
l_rec t%ROWTYPE;
CURSOR c IS
SELECT *
FROM t
WHERE DECODE(processed_flag,'N','N') = 'N'
FOR UPDATE
SKIP LOCKED;
BEGIN
OPEN c;
FETCH c INTO l_rec;
IF ( c%FOUND ) THEN
DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
END IF;
CLOSE c;
COMMIT;
END;
/
Result:
Got row 4, payload 4
See Also:
-
Oracle AI Database New Features Guide (with each release)
-
Oracle AI Database Concepts (with each release)
Cover Database Tables with Editioning Views
If your application uses database tables, then cover each one with an editioning view so that you can use edition-based redefinition (EBR) to upgrade the database component of your application while it is in use, thereby minimizing or eliminating down time.
For information about edition-based redefinition, see Oracle AI Database Development Guide.