2017-06-28 4 views
-2

私はデータベースから同じデータを取り出しますが、それはどのように可能ですか?私はデータベースからフェッチしたスプリングコンテキストでどのように結果を設定するのですか?

私はデータベースにヒットし、毎回同じ結果をフェッチするシナリオを持っています。したがって、私のオブジェクトをスプリングコンテキストで追加し、毎回コンテキストからフェッチします。

+0

乗りを変更する可能性がある場合にはDBに変更しないでくださいキャッシュを見てください。 Springはキャッシングをサポートしています:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html –

答えて

0

スプリングキャッシュAPIを使用する必要があります。初めてCacheableメソッドのスプリングチェックを呼び出し、loadメソッドを実行して(結果をキャッシュに入れる)、2回目のスプリングはメソッド呼び出しの結果があることをチェックし、キャッシュからresaltを返します。メソッドを実行しません。ここで

はあなたのコードに基づい例example from spring web sitebetter example そしてapi

@Component 
public class SimpleBookRepository implements BookRepository { 

@Override 
@Cacheable("books") 
public Book getByIsbn(String isbn) { 
    simulateSlowService(); 
    return new Book(isbn, "Some book"); 
} 

// Don't do this at home 
private void simulateSlowService() { 
    try { 
     long time = 3000L; 
     Thread.sleep(time); 
    } catch (InterruptedException e) { 
     throw new IllegalStateException(e); 
    } 
} 

}


です:

@Component 
public class MasterDataLoader implements InitializingBean { 
    private Set<String> country = new HashSet<String>(); 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     country = getknowledgebase(); 
    } 

    @Cacheable("country") 
    public Set<String> getknowledgebase() { 
     Connection con = null; 
     Set<String> country =new HashSet<>(); 
     try { 
      con = ConnectionProvider.getConnection(); 
      Statement stmt = con.createStatement(); 
      ResultSet rs = stmt.executeQuery("SELECT * FROM knowledgebase"); 
      while (rs.next()) { 
       if (rs.getString("country") != null) { 
        country.add(rs.getString("country").toLowerCase()); 
       } 
      } 
      rs.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return country; 
    } 
} 

- コンストラクタは、それはあなたの最高の場所ではありませんいくつかのロジックを行う必要があります、ロジックをいくつかのプライベートメソッドに変換し、コンストラクタから呼び出す方がよい。

  • また、おそらくあなたはこれのためにスプリングキャッシュが必要ではないと思います。メソッドget ....からSet coutriesを返すだけで、そのメソッドはcountiesを返します。

アップデート2:ケースのため あなたはすべてのデータをすることができますし、彼らは時間

@Component 
public class MasterDataLoader implements InitializingBean { 
    private Set<String> country = new HashSet<String>(); 
    private Set<String> streets = new HashSet<String>(); 
    private Set<String> state = new HashSet<String>(); 

    public Set<String> getCountry() { 
     return country; 
    } 

    public Set<String> getStreets() { 
     return streets; 
    } 

    public Set<String> getState() { 
     return state; 
    } 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     loadCachedData(); 
    } 


    private void loadCachedData() { 
     Connection con = null; 
     try { 
      con = ConnectionProvider.getConnection(); 
      Statement stmt = con.createStatement(); 
      ResultSet rs = stmt.executeQuery("SELECT * FROM knowledgebase"); 
      while (rs.next()) { 
       if (rs.getString("country") != null) { 
        country.add(rs.getString("country").toLowerCase()); 
        streets.add(rs.getString("street").toLowerCase()); 
        state.add(rs.getString("state").toLowerCase()); 
       } 
      } 
      rs.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

とデータが

@Cacheable("country") 
public Set<String> getCountry() { 
    return method that load country from DB; 
} 

@Cacheable("street") 
public Set<String> getStreets() { 
    return method that load street from DB; 
} 

@Cacheable("state") 
public Set<String> getState() { 
    return method that load state from DB; 
} 
+0

Beanを作成し、私のロジックをコンストラクタに入れて私たちは、iocコンテナによって作成されたbeanがデフォルトでアプリケーションコンテキストに置かれていることを知っていますか? – shriram

+0

どのように表示する必要がありますか? – xyz

+0

@Component パブリッククラスMasterDataLoader { \tセット国=新しいHashSet (); getter、setter \t public MasterDataLoader(){ \t \t Connection con = null; \t \t { \t \t \t con = ConnectionProvider.getConnection(); \t \tステートメントstmt = con.createStatement(); \t \t ResultSet rs = stmt.executeQuery( "SELECT * FROM knowledgebase"); \t \tしばらく(rs.next()){ \t \t \t //列名によって \t \t \tを取得する場合(rs.getString( "国")!= null) \t \t \t country.add(rs.getString( "country")。toLowerCase()); \t \t} rs.close(); \t \t} catch(Exception ex){ex.printStackTrace();}} – shriram

関連する問題