{"id":23127993,"url":"https://github.com/antoniojmsjr/multithreadingfiredac","last_synced_at":"2026-02-01T03:39:02.598Z","repository":{"id":47501730,"uuid":"463684989","full_name":"antoniojmsjr/MultithreadingFireDAC","owner":"antoniojmsjr","description":"⚡ Exemplo de utilização de consulta a banco de dados em ambientes multithreading e pool de conexões com FireDAC.","archived":false,"fork":false,"pushed_at":"2024-09-15T17:58:17.000Z","size":5331,"stargazers_count":56,"open_issues_count":0,"forks_count":12,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-06-20T00:08:53.353Z","etag":null,"topics":["api-rest","delphi","fdmanager","firedac","multithreading","pool","thread"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/antoniojmsjr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-25T21:51:13.000Z","updated_at":"2025-05-30T08:41:41.000Z","dependencies_parsed_at":"2024-04-20T02:25:37.815Z","dependency_job_id":"244dc555-d16c-4d5a-ad6c-d36994ce4d47","html_url":"https://github.com/antoniojmsjr/MultithreadingFireDAC","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/antoniojmsjr/MultithreadingFireDAC","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antoniojmsjr%2FMultithreadingFireDAC","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antoniojmsjr%2FMultithreadingFireDAC/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antoniojmsjr%2FMultithreadingFireDAC/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antoniojmsjr%2FMultithreadingFireDAC/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/antoniojmsjr","download_url":"https://codeload.github.com/antoniojmsjr/MultithreadingFireDAC/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antoniojmsjr%2FMultithreadingFireDAC/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28966843,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T02:14:24.993Z","status":"ssl_error","status_checked_at":"2026-02-01T02:13:55.706Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-rest","delphi","fdmanager","firedac","multithreading","pool","thread"],"created_at":"2024-12-17T09:16:02.999Z","updated_at":"2026-02-01T03:39:02.582Z","avatar_url":"https://github.com/antoniojmsjr.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Multithreading (FireDAC)\n\nEm uma aplicação multithread, uma boa prática é isolar os componentes de acesso ao banco de dados, a violação dessa prática pode gerar *erros* do tipo access violation entre outros erros. Para ajudar a resolver esse problema, a [Embarcadero](https://www.embarcadero.com/br/) disponibilizou o componente, **[FDManager](http://docwiki.embarcadero.com/Libraries/Rio/en/FireDAC.Comp.Client.TFDManager)**, que é responsável pela *definição* e *gerenciamento* das conexões e é **thread-safe**(utilização segura em ambientes multithread).\n\n**Fonte:** https://docwiki.embarcadero.com/RADStudio/Sydney/en/Multithreading_(FireDAC)\n\n**Vantagens do uso do FDManager**\n\n* Definição da biblioteca cliente de acesso ao banco de dados. [OPCIONAL]\n  * Por exemplo:\n      * Definição do local da biblioteca cliente(fbclient.dll) do Firebird 2.5;\n      * Definição do local da biblioteca cliente do Firebird(fbclient.dll) 64Bits;\n\n* Centralização das configurações de conexão com o banco de dados.\n    * Por exemplo:\n      * Definição das configurações de acesso ao banco de dados de produção.\n      * Definição das configurações de acesso ao banco de dados de log.\n\n* Centralização das parametrizações do componente TFDConnection. (Esta configuração se estende para todos os FDConnection usado na aplicação)\n  * Por exemplo:\n    * FetchOptions.Mode := TFDFetchMode.fmAll;\n    * ResourceOptions.AutoConnect := True;\n\n\nAlém do uso do **FDManger** uma boa prática e o uso da técnica de otimização de conexão com o banco de dados, chamado de **pool de conexões**.\n\n### O que é pool de conexões com Banco de Dados?\n\nQuando precisamos realizar qualquer operação sobre um banco de dados é primeiramente necessário estabelecer uma conexão com ele, o estabelecimento dessa conexão costuma ocorrer através do protocolo **TCP/IP**, envolvendo custo de **abertura** e **fechamento** da conexão. Esse custo é particularmente significativo em *aplicações Web* onde você pode ter um fluxo de milhares de requisições constante, e cada uma delas vai gerar a abertura e fechamento da conexão com o banco de dados. Uma técnica simples para evitar esse constante \"abre-fecha\" de conexões é manter um determinado número de conexões sempre aberta (um **pool** de conexões) e simplesmente reutilizar quando necessário, dessa forma você diminui tanto o gasto de recurso da máquina quanto o tempo de resposta da sua aplicação.\n\n\nEsse custo para estabelecer uma conexão com o banco de dados pode ser visto na imagem abaixo, utilizando a ferramenta *WireShark* podemos ver a quantidade de pacotes que é utlizado para executar um simples select.\n\n![LogWireShark](https://github.com/antoniojmsjr/MultithreadingFireDAC/assets/20980984/bd44b13e-11fe-46c5-8e83-2692942bc7ca)\n\nPodemos ver na imagem abaixo o comportamento das consultas ao banco de dados usando pool de conexões:\n\n* Do lado esquerdo o famoso \"abre-fecha\", um exemplo de consulta sem a utilização do pool de conexões.\n* Do lado direito, um exemplo de consulta utilizando pool de conexões.\n\n![image](https://github.com/antoniojmsjr/MultithreadingFireDAC/assets/20980984/bfd548e1-87e9-4a55-b83e-e9a0f948c24d)\n\n\n### Configuração do pool de conexões\n\nPara configurar um pool de conexões utilizaremos o **FDManager**, e as propriedades de pool.\n\n| Parâmetro | Descrição | Exemplo |\n|---|---|---|\n|Pooled|Ativa o pool de conexões para um ConnectionDefName informado em FDManager.ConnectionDefs. \u003c/br\u003e\u003c/br\u003e Para usar um pool de conexões, a definição de conexão deve ser [persistente](https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Defining_Connection_(FireDAC)#Creating_a_Persistent_Connection_Definition) ou [privada](https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Defining_Connection_(FireDAC)#Creating_a_Private_Connection_Definition).|True|\n|POOL_CleanupTimeout|O tempo em milissegundos até o FireDAC **remover** as conexões que não foram usadas até o tempo POOL_ExpireTimeout.\u003c/br\u003e\u003c/br\u003eO valor padrão é 30000 ms (30 segundos).|15000 ms\u003c/br\u003e15 s |\n|POOL_ExpireTimeout|O tempo em milissegundos, após o qual a **conexão inativa** pode ser excluída do pool e destruída.\u003c/br\u003e\u003c/br\u003eO valor padrão é 90000 ms (90 segundos).|60000 ms\u003c/br\u003e60 s |\n|POOL_MaximumItems|O número máximo de conexões no Pool.\u003c/br\u003e\u003c/br\u003eQuando o aplicativo requer mais conexões, uma exceção é gerada. O valor padrão é 50.\u003c/br\u003e\u003c/br\u003e**Quando se atinge o número total de conexões especificada nessa  propriedade, é gerado uma exceção:**\u003c/br\u003e\u003c/br\u003e![image](https://github.com/antoniojmsjr/MultithreadingFireDAC/assets/20980984/ad15ed9f-f02a-4a60-b3a1-c37df8b62316)|100|\n\nEm geral, o **FDManager** mantém um pool de conexões \"física\" aberta, quando: \n* Quando TFDConnection.Connected é definido como **True**, o FireDAC pega uma conexão \"física\" do pool e a usa.\n* Quando TFDConnection.Connected é definido como **False**, a conexão \"física\" não é fechada, mas colocada de volta no pool.\n\n### Configuração de acesso ao banco de dados\n\nPara usar o **FDManager** com outros bancos de dados, verificar o link: [Database Connectivity (FireDAC) #Driver Linkage](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Database_Connectivity_(FireDAC))\n\n| Database | DriverID | TFDConnectionDefParams | Units |\n|---|---|---|---|\n| [Microsoft SQL Server](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_Microsoft_SQL_Server_(FireDAC)) | MSSQL | TFDPhysMSSQLConnectionDefParams | FireDAC.Phys.MSSQLDef, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.ODBCBase, FireDAC.Phys.MSSQL |\n| [Oracle Server](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_Oracle_Server_(FireDAC)) | Ora | TFDPhysOracleConnectionDefParams | FireDAC.Phys.OracleDef, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.Oracle |\n| [PostgreSQL](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_PostgreSQL_(FireDAC)) | PG |TFDPhysPGConnectionDefParams | FireDAC.Phys.PGDef, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.PG; |\n| [MySQL Server](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_MySQL_Server_(FireDAC)) | MySQL | TFDPhysMySQLConnectionDefParams | FireDAC.Phys.MySQLDef, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.MySQL |\n| [IBM DB2 Server](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_IBM_DB2_Server_(FireDAC))) | DB2 | TFDPhysDB2ConnectionDefParams | FireDAC.Phys.DB2Def, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.ODBCBase, FireDAC.Phys.DB2 |\n| [Firebird](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_Firebird_(FireDAC)) | FB | TFDPhysFBConnectionDefParams | FireDAC.Phys.FBDef, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.IBBase, FireDAC.Phys.FB |\n| [InterBase](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_InterBase_(FireDAC)) | IB | TFDPhysIBConnectionDefParams | FireDAC.Phys.IBDef, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.IBBase, FireDAC.Phys.IB |\n| [SQLite](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_SQLite_database_(FireDAC)) | SQLite | TFDPhysSQLiteConnectionDefParams | FireDAC.Stan.ExprFuncs, FireDAC.Phys.SQLiteDef, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.SQLite |\n| [MongoDB](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_MongoDB_Database_(FireDAC)) | Mongo | TFDPhysMongoConnectionDefParams | FireDAC.Phys.MongoDBDef, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.MongoDB |\n| [ODBC](https://docwiki.embarcadero.com/RADStudio/Sydney/en/Connect_to_ODBC_Data_Source_(FireDAC)) | ODBC | TFDPhysODBCConnectionDefParams | FireDAC.Phys.ODBCDef, FireDAC.Stan.Intf, FireDAC.Phys, FireDAC.Phys.ODBCBase, FireDAC.Phys.ODBC |\n\n* FireDAC databases supported by RAD Studio: [FireDAC Database Support](https://docwiki.embarcadero.com/Status/en/FireDAC_Database_Support)\n\n## Exemplos\n\nEm anexo no projeto existem dois exemplos de uso de conexão com o banco de dados em ambientes multithread.\n\n1º Exemplo, usando conexões em ambiente multithreading para *desktop*.\u003c/br\u003e\n  * Exemplo compilado: [Download](https://github.com/antoniojmsjr/MultithreadingFireDAC/files/14411938/MultithreadingFireDAC.zip)\u003c/br\u003e\n\n2º Exemplo, usando conexões em ambiente multithreading para servidor web com [Horse](https://github.com/HashLoad/horse).\n * Dependência middlewares\n   * [Jhonson](https://github.com/HashLoad/jhonson)\n   * [Handle-exception](https://github.com/HashLoad/handle-exception)\n * Teste de stress com [JMeter](https://jmeter.apache.org/)\n\nAmbos os exemplo usam o banco de dados Firebird\n* [Firebird 2.5](https://firebirdsql.org/en/firebird-2-5/)\n* Banco MultithreadingFireDAC.FDB\n  * Tabela MULTITHREADING com 100.000 mil registros. \n\n### Exemplo de consulta com pool de conexões ATIVADO:\n* Tempo de execução: 00:00:16.193\u003c/br\u003e\n\nhttps://github.com/antoniojmsjr/MultithreadingFireDAC/assets/20980984/94dea460-6932-4c9b-89a9-0db6ff67b4c7\n\n### Exemplo de consulta com pool de conexões DESATIVADO:\n* Tempo de execução: 00:01:00.929\u003c/br\u003e\n\nhttps://github.com/antoniojmsjr/MultithreadingFireDAC/assets/20980984/75e72a62-5c7d-44c1-86e9-ed0e47cbcac8\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantoniojmsjr%2Fmultithreadingfiredac","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fantoniojmsjr%2Fmultithreadingfiredac","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantoniojmsjr%2Fmultithreadingfiredac/lists"}