2014-05-22 9 views
0

JDBC Java MySQL 드라이버를 사용합니다. 그러나 데이터를 채우고 곧바로 읽을 위치를 테스트 할 때 테스트 속도가 느린 것으로 나타났습니다. 데이터는 나타나지 않지만 몇 초 동안 지연됩니다 - 데이터가 있습니다. 나는이 방법으로 테스트가 작동 할뿐만 아니라 생산 코드도 마지막으로 쓰여진 데이터를 읽을 수 없다는 것을 두려워한다.일부 캐싱을 사용하기위한 MySQL의 구성

필자는 서면 작성 후 바로 읽어야합니다. 지체없이.

캐싱이 도움이 될까요? 봤 거든 시도한 설명서는 여전히 답을 찾지 못했습니다.

private Connection conn = null; 
private Statement stmt0; 
private Statement stmt1; 

@Inject 
public DBConnectorMysql(@Named("JDBC_URL") String url, @Named("JDBC_CRED") String creds) throws SQLException { 
    conn = DriverManager.getConnection(url + creds); 
    stmt0 = conn.createStatement(); 
    stmt1 = conn.createStatement(); 
} 

@Override 
public ResultSet executeQuery(String query) throws SQLException { 
    return stmt0.executeQuery(query); 
} 

@Override 
public int executeUpdate(String query, String... values) throws SQLException { 
    PreparedStatement stmt = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
    int i = 0; 
    for (String s: values){ 
     stmt.setString(++i, s); 
    } 
    stmt.executeUpdate(); 

    int newId = -1; 
    ResultSet rs = stmt.getGeneratedKeys(); 
    if (rs.next()) { 
     newId = rs.getInt(1); 
    } 
    rs.close(); 
    stmt.close(); 
    return newId; 
} 

내가 적극적으로 외래 키가없는 세 개의 테이블을 사용 Mysql driver

자바 SE를 사용합니까 : 여기

내가 삽입 및 검색에 사용 않는 일부 코드입니다.

+0

더 자세히 알려 주실 수 있습니까? 일반 Java 또는 서버, Java EE 등으로 작업하고 있습니까? 더욱이, 당신은 당신이 이야기하고있는 테이블 행의 수에 대한 표시를 할 수 있습니까? – jeconom

+0

질문에 그냥 추가되었습니다. 감사. –

답변

0

코드에서 볼 때 동시에 열려있는 동일한 연결에서 여러 명령문/준비된 명령문 개체를 사용하는 것으로 보입니다. 이것은 예기치 않은 결과를 가져올 수 있습니다 (JDBC 스펙은 이것이 어떻게 처리되는지를 명시하지 않고 각 벤더의 구현에 따라 다르며 이전 버전의 MySQL/JDBC 커넥터와 비슷하게 동작합니다).

언제든지 하나만 열려 있는지 확인해야합니다. 모든 진술을 단순한 것으로 대체 할 수는 있지만, 진술을 executeQuery과 PreparedStatement를 모두 executeUpdate으로 지정하기 때문에 실용적이지 않습니다.

그렇지 않으면 createStatement 호출을 사용하는 메소드 내에서 이동할 수 있습니다. executeQuery의 모범 사례는 결과가있는 ArrayList를 반환하고 반환하기 전에 ResultSet 및 stmt0를 닫는 것입니다.

덜 우아한 해결책은 executeQuery에서 ResultSet을 완료 한 후 stmt0을 닫는 closeQuery 메소드를 작성하는 것입니다.

변경 사항을 적용하려면 rs.close() 전에 conn.commit()으로 전화해야합니다.

관련 문제