Ze śladu stosu i przykładu kodu wygląda na to, że nie używasz ponownie stosu Cayenne (obiekt ServerRuntime), zamiast tego za każdym razem tworzysz nowy. Oprócz powolnego działania powoduje to również wyciek zasobów. Każdy ServerRuntime posiada własną pulę połączeń, której nie można zamknąć. Więc prędzej czy później serwer PostreSQL zostanie przepełniony otwartymi połączeniami.
Rozwiązaniem jest przekształcenie ServerRuntime w singleton o zasięgu aplikacji (np. uczynienie go statyczną zmienną AccountsDBRuntime) i ponowne użycie go za każdym razem, gdy potrzebujesz nowego ObjectContext.