He estado leyendo detenidamente diferentes prácticas recomendadas para bases de datos y para SQLite específicamente. Mientras leía, descubrí que estaba haciendo muchas cosas que no debería estar haciendo y, al intentar solucionar estos problemas, me confundí al pensar en algunos de los detalles más finos del uso de SQLite con su implementación de ADO.Conglomerado de conexiones SQLite/C# y confusión de sentencias preparadas
Mi confusión proviene específicamente de las declaraciones preparadas y la agrupación de conexiones.
Al leer http://msdn.microsoft.com/en-us/library/ms971481.aspx encontré que las conexiones solo deberían abrirse para una transacción. Una vez que se completa la transacción, la conexión debe cerrarse. No tengo una idea clara de por qué este es el caso, pero he estado trabajando en la suposición de que el autor sabe mejor que yo. Entiendo que cuando se cierra una conexión no significa que realmente estado cerrado Simplemente significa que ha sido devuelto a la piscina.
Ahora, para mejorar mis consultas e inserciones, leí sobre el uso de declaraciones preparadas. In SQLite, do prepared statements really improve performance? y http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.html ambos parecían indicar que al ejecutar una consulta que se hará varias veces, las declaraciones preparadas son el camino a seguir. También he leído que una declaración preparada es específica para una conexión y que una vez que se cierra la conexión, la declaración preparada se pierde.
Mi confusión es esta. Si abro y cierro mi conexión (lo que puede o no significa que la conexión se cierre debido al grupo de subprocesos), ¿qué tanto uso obtengo de una declaración preparada? Puedo entender que si tengo 1000 objetos, necesito guardar en una sola transacción que la declaración preparada puede ayudar mucho. Sin embargo, no creo que vea un beneficio al guardar un solo objeto en una transacción porque una vez que cierro la conexión, la declaración preparada que se generó a partir del primer objeto ahora se pierde. ¿Es esta una afirmación verdadera?
Mi confusión se ve favorecida por el hecho de que creo que una declaración preparada está vinculada al alcance de mi objeto SQLiteCommand.
Si creo un SQLiteCommand que representa una consulta que ejecutaré a menudo, ¿debo mantener ese SQLiteCommand en memoria para que la declaración preparada permanezca activa?
Si creo un nuevo SQLiteCommand con la misma instrucción SQLite, ¿reconoce que el nuevo SQLiteCommand es el mismo que el anterior y, por lo tanto, tiene una declaración preparada que se puede usar?
Si guardo un SQLiteCommand en la memoria y cambio sus parámetros y conexión cuando abro y cierro la conexión para diferentes transacciones, ¿estoy esencialmente manteniendo viva una declaración preparada entre diferentes conexiones?
Probablemente estoy pensando demasiado en este punto, pero espero que pueda ayudarme a entender mejor cómo interactúan estas cosas para que pueda obtener el mayor beneficio de ellas.
No estoy muy familiarizado con SQLite, pero con respecto a por qué uno debe cerrar las conexiones lo antes posible, estuvo cerca de responderlo usted mismo: la conexión física subyacente no está cerrada, simplemente devuelve la conexión al grupo. La implicación es que puede ser utilizado por otros hilos. Claramente, si se aferra a una conexión pero no la usa, eso limitará la máxima utilización posible. (Igualmente claro: si estás en un contexto de subproceso único, la agrupación de conexiones no tiene mucho sentido, aunque es poco probable que te haga mucho daño). –