2010-06-12 14 views
6

Estoy tratando de averiguar si es eficiente para mí guardar en caché todas mis declaraciones cuando creo mi conexión a la base de datos o si solo debo crear las más utilizadas y crear las otras si/cuando 're necesarios ..¿Es costoso aferrarse a PreparedStatements? (Java y JDBC)

parece tonto como para crear todo de los estados en todo de los subprocesos de cliente. Cualquier comentario sería muy apreciado.

Respuesta

9

Una base de datos poco decente ya los almacenará en caché. Simplemente ejecute Connection#prepareStatement() en el momento en que realmente necesite ejecutar la consulta. En realidad, tampoco tiene otra opción, ya que la conexión, la instrucción y el conjunto de resultados deben adquirirse y cerrarse en el alcance más corto posible, es decir, en un bloque try-finally con el mismo método que cuando ejecuta la consulta.

Abrir y cerrar la conexión en cada consulta a su vez puede ser costoso. Una solución común para eso es usar un connection pool, por ejemplo c3p0.

2

Esto me suena como el tipo de optimización prematura que no me preocuparía hasta que tenga alguna información que me diga que importaba. Si su acceso a la base de datos es ineficiente, sospecho que su esquema o acceso a los valores antes de pensar en el almacenamiento en caché de las declaraciones preparadas.

4

Pienso que usted es preocuparse demasiado declaraciones preparadas, ya se benefician de varios niveles de almacenamiento en caché:

  • A nivel de base de datos: una base de datos decente va a reutilizar el plan de acceso para una sentencia preparada dada.
  • En el nivel del conjunto de conexiones: un grupo de conexión decente almacenará en caché PreparedStatement objetos para cada conexión de base de datos en el grupo (y devolverá un PreparedStatement en caché en llamadas posteriores al preparedStatement en una conexión).

De hecho, incluso diría que podría estar mirando en la dirección incorrecta. La mejor práctica si desea diseñar una solución escalable es usar un grupo de conexiones y no mantener una conexión más tiempo del necesario y liberarlo (para liberar recursos de la base de datos) cuando haya terminado con esto.

Cuestiones relacionadas