Há pouco tempo comecei a trabalhar com multi-thread em meus aplicativos. Quando usado de forma correta, os resultados são muito bons.

Mas como tudo que é novo, você nem sempre começa fazendo a coisa da forma correta.

Eu tenho threads em alguns aplicativos que importam dados em background, sem interferencia do usuário, e enquanto ele trabalha em outras partes do sistema. A thread de importação usava a conexão do banco de dados para importar os dados, e a thread principal do aplicativo também usava a conexão para atender o usuário.

O problema é que eu não sabia que cada thread que acessa banco de dados precisa de uma conexão independente ao banco e eu compartilhava a mesma conexão com todas as threads. O resultado disso eram várias mensagens de erros estranhas, que não apontavam com clareza o problema.

Todos estes erros abaixo eram decorrentes desse problema:

  • SQL Server Error: SQLDA missing or incorrect version, or incorrect number/type of variables.
  • SQL Server Error: Error reading data from the connection.
  • SQL Server Error: Attempt to reclose a closed cursor.
  • SQL Server Error: Incorrect values within SQLDA structure.
  • SQL Server Error: unassigned code.
  • SQL Server Error: deadlockdeadlockupdate conflicts with concurrent update.
  • Access violation in module ‘FBCLIENT.DLL’.
  • dbExpress Error: [0x0002]: Insufficient Memory for OperationSQL Server Error: unassigned code.
  • InternalDataSet: Cursor not returned from Query.

</em>

No meu caso, eu uso dbExpress (com Firebird), então preciso de uma instância do SQLConnection para cada thread que acessa o banco de dados, dessa forma elas não conflitam quando tentam acessar o banco ao mesmo tempo.

Não esqueça disso, e você poupará muitas horas de dor de cabeça. E não tenha medo de usar threads, o resultado é show de bola!