Tengo un recurso de Jersey que accede a la base de datos. Básicamente abre una conexión de base de datos en la inicialización del recurso. Realiza consultas sobre los métodos del recurso.Cuándo utilizar @Singleton en un recurso de Jersey
He observado que cuando no uso @Singleton, la base de datos se abre en cada solicitud. Y sabemos que abrir una conexión es realmente costoso ¿verdad?
Así que mi pregunta es, ¿debo especificar que el recurso sea singleton o realmente es mejor mantenerlo en solicitud, especialmente cuando el recurso se está conectando a la base de datos?
Mi código de recursos se ve así:
//Use @Singleton here or not?
@Path(/myservice/)
public class MyResource {
private ResponseGenerator responser;
private Log logger = LogFactory.getLog(MyResource.class);
public MyResource() {
responser = new ResponseGenerator();
}
@GET
@Path("/clients")
public String getClients() {
logger.info("GETTING LIST OF CLIENTS");
return responser.returnClients();
}
...
// some more methods
...
}
Y conectarse a la base de datos usando un código similar al siguiente:
public class ResponseGenerator {
private Connection conn;
private PreparedStatement prepStmt;
private ResultSet rs;
public ResponseGenerator(){
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection("jdbc:h2:testdb");
}
public String returnClients(){
String result;
try{
prepStmt = conn.prepareStatement("SELECT * FROM hosts");
rs = prepStmt.executeQuery();
...
//do some processing here
...
} catch (SQLException se){
logger.warn("Some message");
} finally {
rs.close();
prepStmt.close();
// should I also close the connection here (in every method) if I stick to per request
// and add getting of connection at the start of every method
// conn.close();
}
return result
}
...
// some more methods
...
}
Algunos comentarios sobre las mejores prácticas para el código también será útil .
¿Qué tal la agrupación de conexiones? ¿Por qué no usas eso? –