데이터베이스를 쿼리하는 GWT에서 RPC를하고 있는데 내 프로그램에서 메모리 누수가 있고 클래스 설정 방법에 강한 의구심을 갖고 있습니다. 현재, 나는 가지고있는 각 메서드 내에서 데이터베이스에 연결 한 다음 메서드의 끝 부분에서 해당 연결을 닫아야합니다. 이 방법으로 메모리 누수가 발생합니까? 이 방법으로 프로그래밍하는 것이 더 많은 코드로 이어지고 매우 비효율적이지만 많은 좋은 샘플을 찾을 수 없는데 누군가가 이것을 작동시키기 위해 더 좋은 방법을 제안 할 수 있습니까? IP의 이름이 바뀌었고 connect 메소드를 다른 메소드의 작성 방법에 대한 샘플로 게시했습니다.GWT에서 jdbc 호출을 수행하는 올바른 방법은 무엇입니까?
public class DatabaseServiceImpl extends RemoteServiceServlet implements DatabaseService {
private Connection con = null;
String database = "ioma";
String host = "localhost";
String password = "foo";
String url = "jdbc:mysql://" + host + "/" + database;
String user = "foo";
public String connect() {
String connect = "";
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
for (Throwable t : e)
System.err.println("Error connecting to the database: " + t);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
connect = "database connection aquired";
return connect;
}
public int getAssemblerCount() {
connect();
try {
int assemblerCount = 0;
String query = "SELECT COUNT(*) FROM assemblers";
PreparedStatement ps = con.prepareStatement(query);
ResultSet rs = ps.executeQuery();
rs.next();
assemblerCount = rs.getInt(1);
rs.close();
ps.close();
con.close();
return assemblerCount;
} catch (SQLException e) {
for (Throwable t : e)
System.err.println("Database error in getAssemblerCount " + e);
return 0;
}
}}
DB 연결을 관리하는 메소드가있는 유틸리티 클래스를 서블릿 외부에서 사용해야합니다. 서블릿의'init()'과'destroy()'메소드를 오버라이드함으로써 연결을 열고 닫는 메소드를 호출 할 수있다. 유틸리티 클래스에서 검색 할 수있는 DB 연결의 싱글 톤 인스턴스를 갖는 것도 좋습니다. [Gin] (https://code.google.com/p/google-gin/)과 같은 일종의 의존성 주입 프레임 워크를 사용하면이를 피할 수 있습니다. 또한 [Hibernate] (http://www.hibernate.org/)를 권장하므로 저수준 JDBC 코드 대신 Java 객체로 작업 할 수 있습니다. – Churro