¿Cómo hacer una conexión de base de datos para muchos métodos en Java?

Tengo una clase DAO que tiene muchos métodos para manipular la base de datos. Estoy usando un objeto de conexión para todos los métodos como este (Database.connect () devuelve un objeto de conexión):

class ExampleDAOImpl implements ExampleDAO{
  private Connection con = null;

  public void method1 () {
   con = Database.connect();
   ....
   con.close();
  }

  public void method2 () {
   con = Database.connect();
   ....
   con.close();
  }

 public void method1 () {
   con = Database.connect();
   ....
   con.close();
  }
}

¿Es una buena práctica crear una nueva conexión para cada método y cerrarla? Ahora tengo errores que dicen "No se permiten operaciones después de cerrar la conexión" Aunque estoy inicializando la conexión al comienzo de cada método y cerrándola al final. ¿O es mejor usar el mismo objeto de conexión y tener un método separado que lo cierre cuando lo llame?

Respuesta 1

Los objetos de clase ExampleDAOImplno son seguros para subprocesos. Entonces, si más de un hilo usa el mismo ExampleDAOImplobjeto y llama a los métodos al mismo tiempo, podría suceder que uno cierre la conexión y el otro hilo intente usarlo.

Soluciones posibles:

  • Asegúrese de que los ExampleDAOImplobjetos nunca se usen en un contexto de subprocesos múltiples. Esto seguirá siendo propenso a errores.
  • Mejor sugerencia: en lugar de usar un solo ConnectionObjeto, use a ConnectionPoolpara obtener una conexión al comienzo de cada método y libérelo después de terminarlo.
Respuesta: 2

Cuál es el punto de hacer una conexión global al abrir la conexión en cada método. Es probable que esto suceda cuando llama al método2 desde el método1, cierra la conexión utilizada por el método1.

En general, la buena práctica es crear una conexión una vez en la vida de la aplicación y cerrar la conexión al cerrar / salir de la aplicación, ya que hay un costo de abrir y cerrar la conexión .

Respuesta: 3

sus códigos no son seguros para subprocesos , porque la conexión jdbc no se puede usar simultáneamente. Cambie Connection con a ThreadLocal y agregue dos métodos para conectarse y desconectarse.

Los códigos serán como:

public class ConnectionHelper
{
private static ThreadLocal<Connection> con = new ThreadLocal<Connection>();

protected Connection getConnection()
{
if(con.get() ==null)
{
con.set(Database.connect());
}
return con.get();
}

protected Connection closeConnection()
{
if(con.get() !=null)
{
con.get().close;
}
}
}

en su DAO: public void method1 () {try {Connection con = ConnectionHelper.getConnection (); } finalmente {ConnectionHelper.closeConnection (); }}

Respuesta: 4

crear dos funciones una para

  connection()

otro para

  disconnection()

llamar a esos métodos en cada método

  function method()
 {
  //call 

  connection();

  //code;

  //call 

     disconnection();
  } 
Respuesta: 5

Si está utilizando una implementación de Pool de conexiones como BoneCP , está perfectamente bien abrir nuevas conexiones para cada método, solo asegúrese de que el método no haga referencia a la variable de instancia, sino a una variable local.

Por otro lado, si no tiene un grupo de conexiones disponible y trabaja con una sola conexión, tendrá que encontrar un lugar adecuado para cerrar esa conexión, ya que obtener nuevos sin un grupo es bastante costoso.

Respuesta: 6

Estoy tratando de implementar el orden de selección de forma recursiva en Java, pero mi programa sigue lanzando una excepción ArrayIndexOutOfBounds. No estoy seguro de lo que estoy haciendo mal. La recursión es muy difícil para mí. Por favor ...

Me preguntaba cómo funcionan los applets de Java con respecto al acceso a los datos en la PC de un usuario. Por ejemplo, deseo tomar un archivo en su PC y enviarlo al servidor web que aloja mi página web (básicamente un simple ...

Hola chicos, ¿hay alguna manera de contar la cantidad de niños en Firebase? Tengo una estructura de base de datos como esta Testitem1 {test: ""}, Testitem2 {test: ""} Quiero contar solo los nodos Testitem

Actualmente estoy usando la biblioteca jackson gwt y me preguntaba cómo puedo acceder a los valores que están anidados dentro de una cadena json. Mi código de configuración actual se ve así: interfaz estática pública ...