У меня есть ресурс Джерси, который обращается к базе данных. В основном это открывает соединение с базой данных при инициализации ресурса. Выполняет запросы по методам ресурса.
Я заметил, что когда я не использую @Singleton, база данных открывается при каждом запросе. И мы знаем, что открытие соединения действительно дорого, верно?
Таким образом, мой вопрос заключается в том, должен ли я указывать, что ресурс должен быть одноэлементным, или действительно лучше сохранять его на уровне запроса, особенно когда ресурс подключается к базе данных?
Мой код ресурса выглядит так:
//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
...
}
И я подключаюсь к базе данных, используя код, подобный следующему:
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
...
}
Некоторые комментарии по передовым методам для кода также будут полезны.