データベースにアクセスするジャージー リソースがあります。基本的に、リソースの初期化でデータベース接続を開きます。リソースのメソッドに対してクエリを実行します。
@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
...
}
コードのベスト プラクティスに関するコメントも役立ちます。