Is your app releasing connections correctly, we use Apache/tomcat and the sometimes a developer will forget to release a connection which causes the connection pool to slowly increase until it reaches the process limit.
OK heres a query I use to identiy dead connections, it also shows the last sql executed by the connection. If you have a problem with some code not releasing the connection back to the connection pool then you will see lots of connections probably executing the same sql.
NOTE change the 'and last_call_et > 10000' which is the number of seconds SINCE the connection was last used, change it to an appropriate value for your situation.
select logon_time, last_call_et "time inactive",nvl(s.username, 'ORACLE PROCESS') username, s.machine, s.program,
s.sid session_id, s.status,
sql_text, ss.value "CPU used",
trunc(buffer_gets/(executions+1)) "BUFF-EXEC", trunc(buffer_gets/(rows_processed+1)) "BUFF-ROWS",first_load_time, executions, parse_calls, disk_reads, buffer_gets, rows_processed
from v$session s,
where s.sid = ss.sid and
ss.statistic# = sn.statistic# and
sn.name = 'CPU used by this session' and
s.sql_address = sa.address and
s.sql_hash_value = sa.hash_value and last_call_et > 10000
order by machine, status, program, last_call_et asc;