Nancy Ikeda nails it in a great Oracle OpenWorld recording of her Best Practices for Application Performance, Scalability, and Availability session now viewable on the Oracle Call Interface page
The session covered:
Best practice coding samples and techniques show how to resolve connection management, statement execution, and data fetching inefficiencies in applications using APIs such as JDBC, OCI, ODBC, ODP.Net, or higher-level scripting languages. This session shows how the Automatic Workload Repository feature of Oracle Database and Automatic Database Diagnostic Monitor profiling tools help diagnose application design and coding issues. Specific solutions show how to resolve these and other issues to enhance applications for scalability and resilience. Among the solutions discussed are Oracle Database 12c’s new client configuration file. Developers or DBAs can use it to tune and configure applications without modifying code. Examples use JDBC and OCI but are applicable to all APIs.
Nancy is one of Oracle's senior developers working in the call interface group.
The Web Server Gateway Interface (WSGI) is a standardized interface between web servers and Python web frameworks or applications. Many frameworks including Django support WSGI.
This post is a brief how-to about configuring Apache's mod_wsgi with Python's cx_Oracle driver for Oracle Database. The steps are for Oracle Linux.
Download Instant Client Basic & SDK ZIP files from OTN. For cx_Oracle 5.1, use the ZIPs, not the RPMs.
As root, unzip the files to the same directory, e.g.
mkdir /opt/oracle cd /opt/oracle unzip /tmp/instantclient-basic-linux.x64-184.108.40.206.0.zip unzip /tmp/instantclient-sdk-linux.x64-220.127.116.11.0.zip
Configure Instant Client:
cd /opt/oracle/instantclient_12_1 ln -s libclntsh.so.12.1 libclntsh.so
Install the pip package management tool for Python by following pip.readthedocs.org/en/latest/installing.html and downloading
get-pip.py. Then run:
export LD_RUN_PATH=/opt/oracle/instantclient_12_1 export ORACLE_HOME=/opt/oracle/instantclient_12_1 pip install cx_Oracle
The key here is the use of
LD_RUN_PATH. This obviates the need to later set
ldconfigfor cx_Oracle to find the Instant Client libraries. There is a cx_Oracle-specific variable
FORCE_RPATHwhich has the same effect.
Note the cx_Oracle installer overloads the meaning of
ORACLE_HOME. This variable is not normally used with Instant Client.
LD_RUN_PATHneed to be set at runtime.
If you don't use
FORCE_RPATHduring installation, you will need to make
LD_LIBRARY_PATHavailable to the Apache process or use
ldconfigto add Instant Client to the system wide library search path.
ldconfigis an effective and commonly used solution. However it has a potential problem that if multiple Oracle products exist, with possibly differing versions of Oracle libraries on the same machine, then there might be library clashes. If you wish to use it, create a file
Then update the linker cache by running:
LD_LIBRARY_PATHin Apache's environment file,
/etc/sysconfig/httpd. In Oracle Linux 6 use:
In Oracle Linux 7 use:
In Oracle Linux 7, don't reference variables on the right-hand side of the equals sign since they won't be expanded.
[The Apache environment configuration file location varies between Linux distributions. On OpenSUSE see
/etc/sysconfig/apache2. On Debian-based distributions look at
Set any other Oracle environment variables in the Apache environment configuration file
/etc/sysconfig/httpd. For example:
(Prefix any variable setting with
exportin Oracle Linux 6)
yum install mod_wsgi
Add this line to
WSGIScriptAlias /wsgi_test /var/www/html/wsgi_test.py
On Oracle Linux 6, start the web server with:
service httpd start
On Oracle Linux 7 use:
systemctl start httpd.service
Create a test file
/var/www/html/wsgi_test.pythat connects to your database:
#-*- coding: utf-8 -*- def query(): import cx_Oracle db = cx_Oracle.connect("hr", "welcome", "localhost/orcl") cursor = db.cursor() cursor.execute("select city from locations where location_id = 2200") return cursor.fetchone() def wsgi_test(environ, start_response): output = query() status = '200 OK' headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, headers) yield output application = wsgi_test
http://localhost/wsgi_testin a browser. The city of the queried location id will be displayed.
That's it. Let me know how it works for you.
Information on cx_Oracle can be found here.
Information on Oracle Linux can be found here.
Information on Oracle Database can be found here.
Oracle University has released a video from Oracle OpenWorld of a great session by Steven Feuerstein and myself. We walked through a PHP application, showed some application tuning techniques for Oracle Database, and then looked at improving the use of Oracle Database features to aid performance and scalability, and also easily add features to the application.
The video is free for everyone. Lots of the other good content in the Oracle Learning Streams is available via subscription, if you're interested.
We did good in this recent podcast How to Get the Most out of a Technology Conference (which is cleverly disguised as a video). It has everything the inexperienced conference-goer needs to know. I'm pleased to have been able to give a shout out to PHPWomen! Despite the official blurb, the content applies to all technology conferences and there is very little that is specific to Oracle.
It's a super, extra, enormously busy time of the year at Oracle because our big Oracle OpenWorld Conference is next week. We have all been working on new products and new presentations.
I have a full mix of events, meetings, presentations and booth duty. If you're at the conference drop by to say Hi. I'll be at the Application Development booth (Left - SLD-163) in Moscone South on Monday morning, Tuesday lunchtime and Wednesday morning (plus other odd times).
Also lookout for me onstage with Tom Kyte on Monday and with Steven Feuerstein on Wednesday.
The session details, and other sessions you might find interesting are listed on my Focus On Application Development page.
If you are a developer, I recommend coming to the Programming and Scripting "Meet the Expert" session at 6pm Tuesday evening (Moscone South - 307). I cannot stress enough how valuable it is to have a dialog and relationship with the developers who create the software and APIs you use.