Ten problem dotyczy pul połączeń JDBC i dotyczy wszystkich serwerów aplikacji korzystających z pul połączeń JDBC, nie tylko Tomcat. Pule połączeń utrzymają pewną liczbę otwartych połączeń w puli gotowych na następne żądanie. Jeśli połączenie odwołuje się do pakietu PL/SQL i jest on ponownie kompilowany, następne wywołanie tego pakietu spowoduje zgłoszenie błędu ORA-06508. Wpłynie to na pakiety w dowolnym miejscu stosu wywołań - nie tylko na pakiet, który wywołałeś bezpośrednio.
Aby rozwiązać ten problem, niektóre serwery aplikacji (takie jak Weblogic) mają metodę testową, która jest wywoływana okresowo. Jeśli test się nie powiedzie, połączenie zostanie usunięte z puli lub w jakiś sposób odświeżone. Nie jestem pewien, jaki mechanizm ma Tomcat.
Innym sposobem rozwiązania tego problemu jest wywołanie dbms_session.reset_package jako pierwszego wywołania metody w wywołaniu JDBC. Spowoduje to wyczyszczenie stanu pakietu z Twojej sesji. Takie podejście nie jest zalecane, ponieważ wiąże się z obciążeniem wydajnością, a wszelkie zmienne o zakresie pakietu są resetowane, więc bloki inicjalizacji pakietu muszą być wywoływane ponownie - kolejny hit wydajności.
Jeśli masz problem i nie masz sposobu na zerwanie złych połączeń, musisz zresetować całą pulę połączeń, ponieważ każde połączenie w puli będzie cierpieć z tego samego wyjątku.