2014-12-15 2 views
0

저는 vaadin 응용 프로그램이 있으며 SQLContainer를 사용하여 데이터베이스 레코드를 표시했습니다. 데이터베이스 변경이 발생할 때 SQLcontainer 자체를 업데이트하려고한다는 문제가 있습니다. 캠 아무도 도와주세요?Vaadin에서 SQLContainer 자동 새로 고침을 만드는 방법

+1

예를 다음

은 MySQL과 Vaadin이 7.3에서 테스트되었다? 확실히 OP는 자신의 데이터베이스 테이블에서 행이 수정 될 때마다 그의 테이블을 업데이트하려고합니다. 나는 이것에 대한 간단한 해결책을 찾지 못했다. – kukis

+0

[이 페이지] (https://vaadin.com/book/-page/sqlcontainer.caching.html#)에 따르면 새로 고침 기능이 내장되어 있습니다. 'SQLContainer가 연결된 행의 양을 계속 확인합니다 데이터베이스 테이블을 사용하여 외부 추가 또는 행 제거를 감지합니다. 기본적으로 테이블 행 수는 10 초 동안 유효하다고 가정됩니다. 이 값은 코드에서 변경할 수 있습니다. SQLContainer에서 setSizeValidMilliSeconds()와 함께 .' 나는 이것을 확인하지 못했습니다. 또한 UPDATE가 감지되는지도 알지 못합니다. ** 중요 ** 사용자 상호 작용없이 클라이언트 측에 새로 고침을 표시하려면 푸시를 사용해야합니다. –

답변

5

AFAIK 귀하는 MySQL, Oracle 또는 MSSQL과 같은 데이터베이스 시스템의 변경 사항에 "청취자"를 등록 할 수 없습니다. 데이터베이스가 의도 된 방식으로 작동하도록 설계되지 않았습니다.

해결 방법은 JavaScript 호출을 Vaadin에 등록하고 x 초마다 테이블을 업데이트하는 것입니다. 이렇게하면 PushMode를 활성화 할 필요조차 없습니다. 다른 클라이언트가 아닌 서버에 요청을 보내는 클라이언트가됩니다. downvote 왜

final VerticalLayout layout = new VerticalLayout(); 
    setContent(layout); 
    final Table table = new Table("Table"); 
    try 
    {  
     JDBCConnectionPool connectionPool = new SimpleJDBCConnectionPool("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/test", "root", ""); 
     QueryDelegate qd = new FreeformQuery("select * from testTable", connectionPool, "id"); 
     final SQLContainer c = new SQLContainer(qd); 
     table.setContainerDataSource(c);   
    } 
    catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 
    layout.addComponent(table); 
    JavaScript.getCurrent().execute("setInterval(function(){refreshTable();},5000);"); 
    JavaScript.getCurrent().addFunction("refreshTable", new JavaScriptFunction() 
    { 
     @Override 
     public void call(JSONArray arguments) throws JSONException 
     { 
      table.refreshRowCache(); 
     } 
    }); 
관련 문제