Hi Isomorphic,
in order to better understand connection pooling I tried to run our current 12.0p application with sql.pool.maxActive: 1 in server.properties.
This only works under special circumstances. When the client sends the 1st DSRequest, there is a problem on the server side
This is the relevant part of our MyIDACall-handleDSRequest() method:
	This way it works with maxActive: 1, but if I comment in again my logging calls, which are not part of the rpcManager transaction for obvious reasons (log entries should never be rolled-back), the data request is not executed after the SELECT is logged to the console. With logging it does work only with maxActive: 2 or more.
This is the (static) logging method:
	I wonder why the connection is not released for use after addHandleRequest.execute(). I don't see a reason why it is not.
I can see though in Eclipse that there is an undocumented method DSResponse.requestConnectionClose(). Is it somehow related to this?
Thank you & Best regards
Blama
					in order to better understand connection pooling I tried to run our current 12.0p application with sql.pool.maxActive: 1 in server.properties.
This only works under special circumstances. When the client sends the 1st DSRequest, there is a problem on the server side
This is the relevant part of our MyIDACall-handleDSRequest() method:
Code:
	
	                    // store dsHandleLog in database
                    // Long handlerequestID = LogIncomingRequest.addDSRequestLog(rpc, dsRequest, "IDA"); [B]// does not work with [I]maxActive: 1, [/I]dsRequest not executed then[/B]
                    // Execute the request
                    DSResponse handleDSResponse = super.handleDSRequest(dsRequest, rpc, context);
                    // update end date and status after the ds handle request
                    // LogIncomingRequest.updateDSRequestStatus(handlerequestID, handleDSResponse);[B]// does not work with [I]maxActive: 1, [/I]dsRequest not executed then[/B]
                    return handleDSResponse;
This is the (static) logging method:
Code:
	
	    /**
     * Logs incoming DSRequest. Not part of a transaction, so also unsuccessful requests can be logged.
     *
     * [USER="45788"]param[/USER] rpc
     *          {@link RPCManager}
     * [USER="45788"]param[/USER] dsRequest
     *          {@link DSRequest}
     * [USER="45788"]param[/USER] type
     *          process type, "IDA" or "REST"
     * @return ID of the saved record in T_LOG_DSREQUEST, used to later update the end time and status of the request.
     * @throws Exception
     */
    public static Long addDSRequestLog(RPCManager rpc, DSRequest dsRequest, String type) throws Exception {
        Long userID = Long.valueOf(rpc.getUserId());
        Long sessionID = User.getUserSessionId(dsRequest.getHttpServletRequest());
        DSRequest addHandleRequest = new DSRequest(ServerDatasourceEnum.T_LOG_DSREQUEST.getValue(), DataSource.OP_ADD);
        // For requests after relogin this might happen.
        if (userID != -1)
            addHandleRequest.setUserId(userID.toString());
        Map<String, Object> valueMap = new HashMap<>();
        valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__DATASOURCE.getValue(), StringUtils.left(dsRequest.getDataSourceName(), 50));
        valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__OPERATIONTYPE.getValue(), StringUtils.left(dsRequest.getOperationType(), 20));
        valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__OPERATIONID.getValue(), StringUtils.left(dsRequest.getOperationId(), 50));
        valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__CRITERIA.getValue(),
                dsRequest.getCriteria() == null || dsRequest.getCriteria().size() == 0 ? null
                        : StringUtils.left(dsRequest.getCriteria().toString(), 2000));
        {
            Map<String, Object> dataMap = new HashMap<>();
            dataMap.putAll(valueMap);
            valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__DATA.getValue(), StringUtils.left(dataMap.toString(), 2000));
        }
        valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__STARTDATE.getValue(), new Timestamp(System.currentTimeMillis()));
        valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__TYPE.getValue(), type);
        valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__REMOTE_IP.getValue(),
                StringUtils.left(dsRequest.getHttpServletRequest().getRemoteAddr(), 40));
        // For requests that do not require a login, like ones through RestHandler, the sessionID will be -1
        if (sessionID == null || sessionID == -1)
            valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__USER_SESSION_ID.getValue(), null);
        else
            valueMap.put(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__USER_SESSION_ID.getValue(), sessionID);
        addHandleRequest.setValues(valueMap);
        DSResponse addHandleResponse = addHandleRequest.execute();
        if (addHandleResponse.statusIsError())
            return null;
        return Long.parseLong(addHandleResponse.getRecord().get(ServerDatasourceFieldEnum.T_LOG_DSREQUEST__ID.getValue()).toString());
    }
I can see though in Eclipse that there is an undocumented method DSResponse.requestConnectionClose(). Is it somehow related to this?
Thank you & Best regards
Blama

Comment