I suppose that could be an issue if you weren't using a connection pool that periodically closed idle connection or connections that have been use X amount of times.
In a way it is counter-intuitive to me. It seems much simpler that there would be a setting to have #prepareStatement create the cached statement and for close to release it. Then the client processing would match the server processing such that if I create a client-side statement cache, the statement will represent the server-side cached statement, so that when I call a REAL close on the client-side pooled statement it would release those resources on the server. This seems more sane to me. But of course I don't know all the intricacies of why it was not done this way.