2010-07-16 6 views
6

He creado una aplicación de servidor TCPip. La aplicación tiene una TDOConnection global. Esta conexión de ado global se usa tanto para las consultas de subprocesos principales como también dentro de los procesos de subprocesos.Ok para usar TADOConnection en hilos

¿Esto está bien? ¿ADOConnection ha incorporado mecanismos para manejar múltiples consultas al mismo tiempo?

Mi aplicación funciona en entornos de prueba (2-5 conexiones). Pero implementado en un entorno de producción, recibo infracciones de acceso "inexplicables" en el momento en que el TDOQuery vinculado a ADOConnection se abre.

¿Debo utilizar ADOConnection o todas las consultas solo deben hacer la conexión a la base de datos por sí mismas (lo que probablemente sea un poco más costoso)?

+2

duplicado de http://stackoverflow.com/questions/1241844/is-delphis-tadoconnection-thread-safe – jasonpenny

+1

uso de recursos y el tiempo de inicialización de la conexión se puede mejorar utilizando un grupo de conexiones. Por ejemplo, basado en la (s) aplicación (es) de demostración en OmniThreadLibrary (requiere Delphi 2007 o posterior) en http://otl.17slon.com/ – mjn

+0

Gracias - verificaremos esto. Pero primero voy a poner el asunto en marcha, y luego puedo preocuparme por el rendimiento. –

Respuesta

8

Cada hilo tiene que tener su propio objeto de conexión. El siguiente enlace proporciona más información: http://delphi.about.com/od/kbthread/a/query_threading.htm

Algunos puntos clave del artículo:

1] CoInitialize y CoUninitialize debe ser llamado de forma manual antes de usar cualquiera de los objetos DBGO. Si no se llama a CoInitialize, se producirá la excepción "CoInitialize was not called". El método CoInitialize inicializa la biblioteca COM en el hilo actual. ADO es COM.

2] Usted no puede utilizar el objeto TDOConnection del hilo principal (aplicación). Cada hilo necesita crear su propia conexión de base de datos.

+0

Gracias. E incluso creo que también he leído este artículo. Trabajaré en volver a escribirlo. Sin embargo, una cosa: nunca recibo la excepción "Coinitialize was not called". En cambio, solo estoy recibiendo violaciones de acceso. ¿Puede esta excepción ser "silenciosa"? –

+0

Haga un seguimiento de esto. ¿Funcionará la aplicación "bien" siempre que dos consultas nunca se hagan al mismo tiempo? ¿Y solo falla en el momento de las conexiones simultáneas? –

+0

Disculpa la demora, estuvo fuera por un tiempo. Lo siento, no puedo ayudarte con ninguno de tus comentarios. Siempre obtuve la excepción "Coinilialize was not called" y hacer que la llamada aclare las cosas. En cuanto a las consultas múltiples, nunca he tenido un problema, pero sospecho que si hubo varias llamadas al mismo tiempo, pueden surgir problemas, pero no puedo asegurarlo. Gracias por los puntos de representante también. Todavía soy novato en esta materia de la comunidad ... –

7

@M Schenkel, vea esta pregunta Is Delphi’s TADOConnection thread-safe?. Cada subproceso necesita su propia conexión porque ADO es una tecnología basada en COM y utiliza objetos con subprocesos de apartamento.

ver esta muestra

procedure TMyThread.Execute; 
begin 
    CoInitialize(nil); 
    try 
    try 
     // create a connection here 
    except 
    end; 
    finally 
    CoUnInitialize; 
    end; 
end; 
+0

Muchas gracias. Parece que usted y Vic Adams escribieron esencialmente la misma respuesta casi al mismo tiempo. Como no hay forma de "compartir" los votos, pensé que sería bueno darle a Vic (solo 31 puntos de reputación) el voto. Espero que no te tomes ninguna excepción a esto. –

Cuestiones relacionadas