select namespace,gethitratio from v$librarycache; select name,gets,misses,sleeps from v$latch where name like 'library%'; select name,pid from v$latch a , v$latchholder b where a.addr=b.laddr and name = 'library cache%' ;and the typical response is "Reduce parsing, increase the shared pool".
Easily said but not so easily done, especially for pre-packaged applications. (A lot of ODBC developers come up with the "brainwave" of passing literal SQL strings due to the slowness of ODBC binding without really knowing the parsing impact that results).
Whilst not a perfect cure, reducing fragmentation in the shared pool can assist, so at regular "quiet" intervals, issue a
alter system flush shared_pool;