Лучше хранить результаты запроса в оперативной памяти, или каждый раз заново делать запрос к БД?
Зависит от многих условий. Однако, учтите, что:
1. Запрос к базе дороже по ресурсам, чем собственная память. Памяти у вас на хосте обычно гигабайты, плюс локальный SWAP. Частые же запросы к базе создают на нее нагрузку и конкурируют с другими запросами.
2. Доступ к собственной памяти во много-много-много раз быстрее доступа по сети.
Отсюда вывод - кэширование необходимо и вы все делаете правильно.
Для того, чтобы не съедать ВСЮ память, нужно ограничиться определенным (настраиваемым!) объемом, при выходе за который самые старые данные (к которым давно не было обращений) из кэша удалять. 
Чтобы не получить ситуацию, когда в базе данные поменялись, а вы об этом ничего не знаете, воспользуйтесь pg_notify
Немного из другой области (Java EE), но  вдруг пригодитьсяpublic static List<Order> getOrders() throws SQLException, ... {
  List<Order> result = new ArrayList<>();  
  InitialContext initContext = new InitialContext();
  DataSource ds = (DataSource) initContext.lookup("jdbc/ИМЯ_РЕСУРСА");
  try (Connection conn = ds.getConnection()) {
      Statement stm = conn.createStatement();
      ResultSet res = stm.executeQuery(" SELECT * FROM  `orders` бла-бла-бла ;");
      //кешируем запрос
      CachedRowSet crs = new com.sun.rowset.CachedRowSetImpl();
      crs.populate(res);
      //работаем с ним
      if (crs.size() > 0) {
          crs.first();
          do {
                String id = crs.getString("id");
                String number = crs.getString("number");
                //формирование результ.Объекта
                result.add(new Order(id, number));
          } while (crs.next());
          countRows = result.size();  //сохраним колво
      }
   } //try
  return result;
}

После ресурсы подключения к БД автоматически закрываются.