2009-06-05 22 views
2

私はthis postを読みましたが、ThreadLocalまたはDataSourceLookupまたはAbstractRoutingDataSourceを使用してリクエストにアクセスする方法を理解できません。私はすべてのポストを読むが、それはまだ動作しません。Springのデータソースにどのようにアクセスできますか?

は、どのように私は私の要求のdataSourceパラメータにアクセスして、動的に彼らとの接続を作成するのですか?

答えて

0

どのようなパラメータが意味するのか、その要求は何か分かりません。あなたはWebアプリケーションを作成しようとしていますか?これはHttpRequestですか?要求に基づいて必要なデータソースを決定していますか?

これらの質問への回答に応じて、データ・ソースへの動的アクセスを取得する必要がないかもしれません。

あなたが複数のデータソース、要求の異なる種類を提供し、それぞれを持っている場合は、私は、データソースは、特定のURLのために選択されたウェブ・コントローラに注入されているサービスオブジェクトに注入する必要があることをお勧めしたいです。そうした方法でデータソースを変えることができ、Web層のURLマッピングよりも面倒なことはありません。

あなたのユースケースの詳細を知らなくても、私はあなたが春に新しいしていると、まだそれを正しく使用する方法がわからないので、あなたは物事を複雑に上だと思いたいです。侮辱は意図されておらず、ただの推測です。

UPDATE:

「私はそれを変更することはできません」 - あなたは、少なくとも仮定する前に、クライアントでそれを議論する必要があります。これは悪い考えです。パラメータを暗号化しても保存されません。

あなたは、コントローラは、あなたが必要とするすべてのデータソースを注入しています工場をインスタンス化するために使用することができ、工場を作る方がいいでしょう。データソースをマップに格納し、前後にキーを渡してデータソースを取得するだけです。コントローラはすでにリクエストにアクセスできます。ユーザーはデータベースに関するすべての詳細を知る必要がなくなります。ルックアップを単純なキーにします(これは私がまだ好きではありません)。

あまりにも難しいと思われる場合は、おそらくそれを行うべきではありません。より簡単な方法があります。それを考えてください。

+0

こんにちは、私は春で複数のデータソースBeanを作成したいのですが、接続パラメータ(URL、ドライバー、ユーザーは、...)私のアプリケーションに別のWebアプリケーションによって渡され、i'm休止状態使用して、私はどのように知りません接続dynamicalyを作成するためのリクエストにパラメータを渡すために、私は解決策は、この記事の末尾にあると思う: http://stackoverflow.com/questions/517353/how-to-design-daos-when-the-データソース-動的に変化申し訳ありませんが、私はいないだろうな設計のように聞こえる/ 958563#958563 をしかし、私は、助けを 感謝をThreadLocalのかDataSourceLookupまたはAbstractRoutingDataSourceを使用して要求へのアクセスを得るためにどのように理解しない... –

+0

多くのように。接続パラメータを渡す別のWebアプリケーションですか?いいえ、これはカプセル化の最悪の種類です。あなたは、クライアントが必要とするすべてのデータソースを知るように強制していますか?間違った、間違った、間違っている。それを再考してください。それはあなたの最初のアイデアかもしれませんが、最後にしないでください。 – duffymo

+1

これらのパラメータを渡すと、接続プーリングを利用できなくなります。これはどのようにスケールできますか? – duffymo

1

私は、これはあなたがにリンクされている答えができたもののようなものだと思う:

警告:このどれがコンパイルされていません。これはどれもテストされていません。

CurrentRequestFilter

は、リクエストごとに一回実行されます。後で使用される ThreadLocalに現在の要求を格納する責任があります。

public class CurrentRequestFilter extends OncePerRequestFilter { 

    private ThreadLocal<HttpServletRequest> currentRequest; 

    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) { 
     currentRequest.set(request); 
     filterChain.doFilter(request, response); 
    } 

    public ThreadLocal<HttpServletRequest> getCurrentRequest() { 
     return currentRequest; 
    } 

    public void setCurrentRequest(ThreadLocal<HttpServletRequest> currentRequest) { 
     this.currentRequest = currentRequest; 
    } 

} 

CurrentRequestDataSourceCurrentRequestFilterと同じThreadLocalへのアクセス権を持っています。

public class CurrentRequestDataSource extends AbstractRoutingDataSource { 

    private ThreadLocal<HttpServletRequest> currentRequest; 

    @Override 
    protected DataSource determineTargetDataSource() { 
     HttpServletRequest request = currentRequest.get(); 

     String url = ...; 
     String username = ...; 
     String password = ...; 
     DataSource dataSource = ...; 

     return dataSource; 
    } 

    @Override 
    protected Object determineCurrentLookupKey() { 
     return null; 
    } 

    public ThreadLocal<HttpServletRequest> getCurrentRequest() { 
     return currentRequest; 
    } 

    public void setCurrentRequest(ThreadLocal<HttpServletRequest> currentRequest) { 
     this.currentRequest = currentRequest; 
    } 
} 

あなたは、このような何かあなたのBean定義を構成します:あなたは、その後CurrentRequestFilterがあなたのweb.xmlファイルに登録されていることを確認する必要があります

<bean id="currentRequest" class="java.lang.ThreadLocal"/> 

<bean id="currentRequestFilter" class="CurrentRequestFilter"> 
    <property name="currentRequest" ref="currentRequest"/> 
</bean> 

<bean id="dataSource" class="CurrentRequestDataSource"> 
    <property name="currentRequest" ref="currentRequest"/> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

:再び

<filter> 
    <filter-name>Current Request Filter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <init-param> 
     <param-name>targetBeanName</param-name> 
     <param-value>currentRequestFilter</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>Current Request Filter</filter-name> 
    <servlet-name>Name_Of_Your_Servlet</servlet-name> 
</filter-mapping> 

、なしこれはテストされていますが、うまくいけばそれはいくつかのガイダンスを提供することができます。

+0

すべては私には少しファンキーなにおいが、それはトリックを行う必要がありますように、これは見えます。 –

+0

記録のために、私は少しファンキーに見えることに同意します。私はそれを自分でやっていないだろう。私はちょうど他の仲間が推薦しているものを見て興味がある。真実を伝えておいてください。他の人の答えは、新しいデータソースを最初から作成することではありませんでした。むしろ、彼はいくつかの事前に構築されたデータソースの中から選択していました。 –

関連する問題