2013-08-12 3 views
0

데이터베이스를 쿼리하는 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; 
    } 

}} 
+0

DB 연결을 관리하는 메소드가있는 유틸리티 클래스를 서블릿 외부에서 사용해야합니다. 서블릿의'init()'과'destroy()'메소드를 오버라이드함으로써 연결을 열고 닫는 메소드를 호출 할 수있다. 유틸리티 클래스에서 검색 할 수있는 DB 연결의 싱글 톤 인스턴스를 갖는 것도 좋습니다. [Gin] (https://code.google.com/p/google-gin/)과 같은 일종의 의존성 주입 프레임 워크를 사용하면이를 피할 수 있습니다. 또한 [Hibernate] (http://www.hibernate.org/)를 권장하므로 저수준 JDBC 코드 대신 Java 객체로 작업 할 수 있습니다. – Churro

답변

1

"최종"블록을 항상 닫아야 예외 상황이 발생합니다.

제대로 수행하는 데 도움이되는 답변은 this related question을 참조하십시오.

이것은 메모리 누수의 일반적인 원인이며 문제 일 가능성이 큽니다.

+1

연결을 관리하기 위해 서버의 연결 풀을 사용하는 것이 유용 할 수도 있습니다. – aglassman

관련 문제