2012-10-04 21 views
5

Quiero saber cuál es seguro & mejor manera de utilizar la variable de conexión de siguiendo.declare la variable de conexión

Primero: Conexión como variable miembro de clase de la clase

class MyClass 
{ 
    Connection conn; 

    public MyClass(Connection conn) { 
     this.conn = conn; 
    } 

    public void myMethod(){ 
     //Do some DB operations using conn 
    } 
} 

Segundo: inicializar la conexión en el método

class MyClass 
{  
    public MyClass() {  
    } 

    public void myMethod(){ 
     Connection conn= initializeFunction(); //Initialize Connection 
     //Do some DB operations using conn 
    } 
} 

Tercero: Enviar conexión como argumento para funcionar

class MyClass 
{  
    public MyClass() {  
    } 

    public void myMethod(Connection conn){ 
     //Do some DB operations using conn 
    } 
} 

NOTA: La pregunta no es específica del lenguaje de programación, por lo tanto, he agregado etiquetas distintas de J ava también.

Respuesta

6

Cuando se trata de objeto de conexión de base de datos, lo mejor es: Para abrir lo más tarde posible y cerrar tan pronto como sea posible.

En C# hay una instrucción using que funciona con objetos que implementan la interfaz IDisposable. using instrucción funciona como try/finally bloque de código. OMI la práctica general para el manejo de la conexión debe ser algo como:

try 
{ 
connection = new Connection(); 
connection.Open(); // open the connection 
//work with the connection, DB CRUD operations 
} 
finally 
{ 
if(connection != null) 
    connection.Close(); // close the connection in finally block 
         // so that even if the exception occurs, connection gets closed. 
} 

para sus opciones, creo que el primero es el peor de los casos, que posee el objeto connetion junto con el objeto de la clase.

Creo que debería preocuparse más por abrir/cerrar la conexión que por sostener el objeto de la conexión en varios lugares.

3

Elegiría la segunda opción, con una pequeña modificación. Cambiaría la llamada al initializeFunction() a un objeto Singleton, lo que produciría una conexión. Luego lo cerrarás en el momento en que ya no lo necesites.

1

Depende de si su conexión va a ser utilizada por muchos dispositivos. Recomiendo abrirlo y cerrarlo lo más rápido posible, así que la opción 2 sería lo mejor para mí. Solo usa la conexión cuando la necesites. También podría estar interesado en la biblioteca c3po para agrupar sus conexiones.

Generalmente, si estoy eliminando variables que se utilizan en cualquier otro lugar de la clase, utilizaría la opción 1 y haría la conexión definitiva. Como esta es una conexión db, creo que las reglas cambian ligeramente.

6

Los tres enfoques proporcionan una funcionalidad diferente:

  1. Su clase posee el objeto de conexión y el objeto de conexión será mantenerse con vida el tiempo que su objeto se mantiene vivo.
  2. El objeto de conexión es local al método y caduca una vez que el método retorna.
  3. La persona que llama del método posee el objeto de conexión.

La elección depende de:

  • ¿Cómo quieres manejar la propiedad del objeto de conexión &
  • Hay que tener en cuenta que la conexión de base de datos tiene que ser abierto sólo siempre que sea necesario y no todo el tiempo, mientras que también,
  • Con qué frecuencia le gustaría conectarse a la base de datos.
4

La forma correcta de usar Connection es siempre para declarar Connection dentro using declaración:

using (var connection = InitializeConnection()) 
{ 
} 

Que se encargará de cerrar la conexión automáticamente, incluso excepciones tirar.

Afortunadamente, detrás de la escena ADO.NET use Connection Pool para administrar y optimizar las conexiones a la base de datos automáticamente, por lo que no necesita importar cuántas conexiones se abren en su aplicación. Solo son conexiones lógicas.

No se limite a mantener servicios de larga porque va a ralentizar el rendimiento y no hacer uso de la conexión en paralelo de agrupación de conexiones

3

Yo iría por la opción 1 o 3, dependiendo de la exigencia.

  • Elegiría la opción 1 si hay más métodos que el definido utilizando la conexión. Con el método 1 es fácil de usar Dependencia de inyección y Inversión de control.

  • Elegiría la opción 3 si ese método en mi clase era el único método que utilizaba la conexión.

Método 2 es difícil de probar, porque no hay ninguna manera se puede definir un simulacro de objeto para la conexión.

Además, sugeriría que no pasa un tipo sino una interfaz -MyClass.

+0

'Sugeriría no pasar un tipo pero una interfaz para MyClass' ¿pueden por favor explicar más sobre él. –

3

Esto dependería de si desea proporcionar la capacidad de modificar el objeto Connection fuera del método.

Personalmente me gustaría ir con la Opción 1 o 2. Option 1 si MyClass es un contenedor de base de datos con múltiples métodos asociados con él, es decir, de conexión a una base de datos, SharePoint, Correr procedimientos almacenados etc. Option 2, aunque sólo se utilizó el objeto de conexión durante un período breve, es decir, abrir una conexión y procesar los datos en otro lugar. Option 3, no preferiría pasar un objeto Connection a un método, pero esto es solo una preferencia personal.

3

La solución preferida depende completamente del entorno de programación.Lo que es cierto para Java o cualquier otro proceso de larga ejecución, es incorrecto para PHP y similar ejecución por solicitud.

En Java, generalmente tiene un grupo de conexión de base de datos que usar, que limita limitar el número de conexiones simultáneas a la base de datos porque la mayoría de las veces están inactivas. En promedio, no necesita tantas conexiones como consultas en el código. Pero, por otro lado, sería una pérdida de tiempo si se conectara a la base de datos solo porque se debe ejecutar la primera consulta. Los programas Java se ejecutan constantemente, ¿por qué no abrir una cantidad adecuada de conexiones DB en statup? Entonces están listos cuando se necesitan.

En PHP, cuando termina una secuencia de comandos, todo se olvida y se elimina en la memoria. Simplemente no hay lugar para almacenar una conexión de base de datos activa en curso. Entonces, el mejor enfoque es conectarse a la base de datos en el momento en que sepa con certeza que debe enviar una consulta. Por otro lado, no estoy de acuerdo con 'cerrarlo lo antes posible' en PHP porque se cerrará cuando termine el guión, lo que es razonablemente pronto. Cerrar prematuramente la conexión puede significar que debe volver a abrirla para otra consulta.

También me opondría a la idea de singletons para la conexión DB en PHP (Java podría ser un juego diferente). Sí, normalmente solo tendría una base de datos, pero ¿y si no? Los Singleton evitan que uses dos bases de datos, no comiences con ellas. mysqli_connect() usa una conexión existente si usa los mismos parámetros de conexión (servidor, nombre de usuario, contraseña) y actúa como un singleton para usted, por lo que no es necesario volver a hacerlo en PHP.

Cuestiones relacionadas