Kbase P135628: State-free appserver broker uses up maximum number of connections if client makes many asynchronous
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  6/26/2009 |
|
Status: Verified
SYMPTOM(s):
State-free AppServer broker uses up maximum number of connections if client makes many asynchronous calls
Client did not specify -maxConnections in AppServer connection string
Client starts many asynchronous calls in a tight loop
AppServer broker log shows following errors:
ERROR: connection refused : maximum number of client connections has been reached. (8558)
Error Maximum number of client connections has been reached. ... disconnecting client. (8091)
Client shows following errors:
Maximum number of client connections has been reached
Application server connect failure. (5468)
FACT(s) (Environment):
OpenEdge 10.x
All Supported Operating Systems
CAUSE:
In the session-free model, the client manages it's own connection pool, a number of physical connections to handle the AppServer requests.
If no connections are available for re-use, new connections will be added to the pool until the maximum size as specified with the -maxConnections parameter is reached.
When no -maxConnections is specified the size of this pool is "unlimited", meaning it depends entirely on system resources.
The connections in the pool become available for reuse when the PROCEDURE-COMPLETE event for the request using the connection has been handled.
The client does not process these events unless:
- An input-blocking statement or the PROCESS EVENTS statement is encountered.
- There are no free connections in the connection pool when a new request is sent, and the pool is at maximum size. (In this case the events are handled to try and free up existing connections.)
The issue that is seen when the client has an unlimited connection pool is that if the PROCEDURE-COMPLETE event is never handled, it will keep adding connections which will then push the AppServer broker over it's limit.
FIX:
Ensure events are handled within the loop by inserting a PROCESS EVENTS statement inside of the loop.