Shared database links are there since Oracle 9iR2, but strangely I have never seen their existence until a customer asked me how to identify in DBA_DB_LINKS (or ALL_) if a database link has been created shared or not…
First, shared database links aim is to reduce number of connection to remote database by sharing same connection link between source and remote by multiple users’ sessions. This can also be seen as a JDBC connections pooling to concentrate multiple session and limit number of real connections onto the database (to obviously save CPU and memory).
Note this functionality is usable whatever you are in dedicated or shared server SQL*Net configuration.
Example of creation:
SQL> CREATE shared DATABASE LINK test2 CONNECT TO yjaquier IDENTIFIED BY password authenticated BY yjaquier IDENTIFIED BY password; DATABASE LINK created.
Then after issue is to know how has been created this database link (the private or public database links are easy to identify with OWNER column), so started from the initial definition of the DBA_DB_LINKS:
SELECT u.name, l.name, l.userid, l.host, l.ctime FROM sys.LINK$ l, sys.USER$ u WHERE l.owner# = u.USER#;
And if you construct something like:
SELECT u.name, l.* FROM sys.LINK$ l, sys.USER$ u WHERE l.owner# = u.USER# ORDER BY u.name
Columns AUTHUSR et AUTHPWD are different from NULL, column FLAG is equal to 3 so here is the difference even if it is not documented by Oracle…
As explained in official documentation make sure many connections will be initiated using this shared database link unless this may have lead to more network connections…