Integração JDBC Oracle - Protheus x Fluig

  1. Criei um serviço JDBC com a URL:jdbc:oracle:thin:@10.10.34.56:1521/dbconerp, salvei e teste de conexão Ok!
  2. Criei um dataset dsColetarDadosCTT para retornar os dados de um centro de custo específico. Teste Ok!
  3. Criei um dataset dsColetarDadosSC7 para retornar os dados dos itens do pedido de compras. Mas estou com o erro a seguir:

2026-07-15 16:39:32,995 ERROR [com.datasul.technology.webdesk.customization.ScriptingLog] (default task-239) ERRO==============> java.sql.SQLRecoverableException: IO Error: An existing connection was forcibly closed by the remote host
2026-07-15 16:39:32,995 ERROR [com.datasul.technology.webdesk.customization.CustomizationManager] (default task-239) - Usuário Executor : admin - Substituto : Não - Executando evento : createDatasetERRO AO EXECUTAR SCRIPT → NOK - Wrapped java.sql.SQLRecoverableException: Closed Connection
2026-07-15 16:39:32,995 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-239) CustomizationManagerImpl.invokeFunction.createDataset executou por 303 segundos
2026-07-15 16:39:32,995 WARN [com.fluig.monitoring.jschronos.JSChronos] (default task-239) params: [null, [Lcom.totvs.technology.foundation.dataset.SearchConstraint;@32387d8a, null, Thread = default task-239, datasetId = dsColetarDadosSC7]]
2026-07-15 16:39:32,995 ERROR [com.datasul.technology.webdesk.dataset.CustomizedDatasetBuilder] (default task-239) Não foi possível executar script do dataset.
2026-07-15 16:39:32,995 ERROR [com.datasul.technology.webdesk.dataset.CustomizedDatasetBuilder] (default task-239) Wrapped java.sql.SQLRecoverableException: Closed Connection: com.datasul.technology.webdesk.customization.CustomizationException: Wrapped java.sql.SQLRecoverableException: Closed Connection

function createDataset(fields, constraints, sortFields) {

	log.info('>> dsColetarDadosCTT <<');
    log.info('>> constraints <<');
    log.dir(constraints);
	
    var newDataset = DatasetBuilder.newDataset();
    var dataSource = "java:/jdbc/Protheus";
    var ic = new javax.naming.InitialContext();
    var ds = ic.lookup(dataSource);
    var created = false
    var CTT_CUSTO = "01030601001";

    if(constraints != null && constraints.length > 0){
        for (var c = 0; c < constraints.length; c++){         
            if(constraints[c].fieldName == "CTT_CUSTO" && constraints[c].initialValue != null ){
            	CTT_CUSTO = constraints[c].initialValue;
            }
        }
    }

    var query = " SELECT * "
              + " FROM CTT010 CTT "
              + " WHERE CTT.CTT_CUSTO = '"+CTT_CUSTO+"' "
              + " AND   CTT.D_E_L_E_T_ = ' '  ";

    log.info('>> dsColetarDadosCTT >> query: '+query)
    
    try {
        var conn = ds.getConnection();
        var stmt = conn.createStatement();
        var rs = stmt.executeQuery(query);
        var columnCount = rs.getMetaData().getColumnCount();
        while (rs.next()) {
            if (!created) {
                for (var i = 1; i <= columnCount; i++) {
                    newDataset.addColumn(rs.getMetaData().getColumnName(i));
                }
                created = true;
            }
            var Arr = new Array();
            for (var i = 1; i <= columnCount; i++) {
                var obj = rs.getObject(rs.getMetaData().getColumnName(i));
                if (null != obj) {
                    Arr[i - 1] = rs
                            .getObject(rs.getMetaData().getColumnName(i))
                            .toString();
                } else {
                    Arr[i - 1] = "null";
                }
            }
            newDataset.addRow(Arr);
        }
    } catch (e) {
        log.error("ERRO==============> " + e.message);
    } finally {
        if (stmt != null) {
            stmt.close();
        }
        if (conn != null) {
            conn.close();
        }
    }
    return newDataset;
}

function createDataset(fields, constraints, sortFields) {

	log.info('>> dsColetarDadosSC7 <<');
    log.info('>> constraints <<');
    log.dir(constraints);
	
    var newDataset = DatasetBuilder.newDataset();
    var dataSource = "java:/jdbc/Protheus";
    var ic = new javax.naming.InitialContext();
    var ds = ic.lookup(dataSource);
    var created = false
    var C7_FILIAL = "01010004";
    var C7_NUM = "238816";

    if(constraints != null && constraints.length > 0){
        for (var c = 0; c < constraints.length; c++){         
            if(constraints[c].fieldName == 'C7_FILIAL' && constraints[c].initialValue != null ){
            	C7_FILIAL = constraints[c].initialValue;
            }
            if(constraints[c].fieldName == 'C7_NUM' && constraints[c].initialValue != null ){
            	C7_NUM = constraints[c].initialValue;
            }
        }
    }

    var query = " SELECT * "
              + " FROM SC7010 SC7 "
              + " WHERE SC7.C7_NUM = '"+C7_NUM+"' "
              + " AND SC7.C7_FILIAL = '"+C7_FILIAL+"' "
              + " AND SC7.D_E_L_E_T_ = ' ' ";

    log.info('>> dsColetarDadosSC7 >> query: '+query)
    
    try {
        var conn = ds.getConnection();
        var stmt = conn.createStatement();
        var rs = stmt.executeQuery(query);
        var columnCount = rs.getMetaData().getColumnCount();
        while (rs.next()) {
            if (!created) {
                for (var i = 1; i <= columnCount; i++) {
                    newDataset.addColumn(rs.getMetaData().getColumnName(i));
                }
                created = true;
            }
            var Arr = new Array();
            for (var i = 1; i <= columnCount; i++) {
                var obj = rs.getObject(rs.getMetaData().getColumnName(i));
                if (null != obj) {
                    Arr[i - 1] = rs
                            .getObject(rs.getMetaData().getColumnName(i))
                            .toString();
                } else {
                    Arr[i - 1] = "null";
                }
            }
            newDataset.addRow(Arr);
        }
    } catch (e) {
        log.error("ERRO==============> " + e.message);
    } finally {
        if (stmt != null) {
            stmt.close();
        }
        if (conn != null) {
            conn.close();
        }
    }
    return newDataset;
}

Cheguei abrir um chamado na TOTVS sobre a questão mas informaram que poderia ser alguma restrição no ambiente do cliente como Firewall ou algum software de segurança, mas o cliente não possui. Via SQL Developer no VSCode não tenho problemas ao rodar as consultas, utilizando a mesma string de conexão e autenticação.

Alguma dica?

Buenas Mestre,

O erro ta nitido no log, vc esta tomando um timeout do banco!
seu dataset executou por quase 5 minutos (303 segundos).
talvez a query deste 3 dataset precise receber um parametro do pedido de compra! para retornar menos itens!

Com certeza não é culpa do Fluig esse disconect!

Ao alterar os parâmetros NLS_SORT e NLS_COMP para BINARY na tabela nls_session_parameters o problema foi resolvido!