A general consideration first.
In the log we notify at INFO level the closing of all sessions, so this is as normal as session opening.
Hence, consider that these messages may not signal any problem, if the closing occurs at the proper time.
This is why we just report internal cause codes; anyway, starting with the next release, we will report actual cause names.

Turning to your case:
We use 39 for a session that closes because it was waiting for a rebind from the client but the timeout configured with <session_timeout_mills> eventually expired.
We use 45 for a session that has been abandoned by the client, which in fact has asked for a new session and has indicated the former as an "old session" in its request.
Both cases may signal a problem in client-server communication.
The most normal close code is 38, which means that the client has interrupted its connection.