ライブラリ管理
23353 ワード
2つのデータソース+1つのデータルータの構成
カスタムデータソース
アクションでバインド
//現在のスレッドにバインドされたSurveyToken token=new SurveyToken()token.setSurvey(getCurrentSurvey()); SurveyToken.bindingToken(token);
1 <!-- ( ) -->
2 <bean id="dataSource_main" class="com.mchange.v2.c3p0.ComboPooledDataSource">
3 <property name="jdbcUrl" value="${jdbc.url}"></property>
4 <property name="user" value="${jdbc.username}"></property>
5 <property name="password" value="${jdbc.password}"></property>
6 <property name="driverClass" value="${jdbc.driverClass}"></property>
7
8 <property name="maxPoolSize" value="${c3p0.pool.size.maxsize}"></property>
9 <property name="minPoolSize" value="${c3p0.pool.size.minsize}"></property>
10 <property name="initialPoolSize" value="${c3p0.pool.size.init}"></property>
11 <property name="acquireIncrement" value="${c3p0.pool.size.increment}"></property>
12 </bean>
13
14 <!-- ( ) -->
15 <bean id="dataSource_1" parent="dataSource_main">
16 <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/surveypark_1"></property>
17 </bean>
18
19 <!-- -->
20 <bean id="datasource_router" class="kite.datasource.SurveyparkDataSourceRouter">
21 <property name="targetDataSources">
22 <map>
23 <entry key="odd" value-ref="dataSource_main" />
24 <entry key="even" value-ref="dataSource_1"></entry>
25 </map>
26 </property>
27 <property name="defaultTargetDataSource" ref="dataSource_main"></property>
28 </bean>
29
30 <!--
31 bean,spring hibernate
32 -->
33 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
34 <!-- -->
35 <property name="dataSource" ref="datasource_router"></property>
36 <!-- hibernate -->
37 <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
38 <!-- -->
39 <property name="mappingDirectoryLocations">
40 <list>
41 <value>classpath:kite/domain</value>
42 </list>
43 </property>
44 </bean>
1 package kite.datasource;
2
3 import kite.domain.Survey;
4
5 /**
6 * , , .
7 */
8 public class SurveyToken
9 {
10 private Survey survey;
11
12 private static ThreadLocal<SurveyToken> t = new ThreadLocal<SurveyToken>();
13
14 /**
15 *
16 */
17 public static void bindingToken(SurveyToken surveyToken)
18 {
19 t.set(surveyToken);
20 }
21
22 /**
23 *
24 * @return
25 */
26 public static SurveyToken getCurrentToken()
27 {
28 return t.get();
29 }
30
31 /**
32 *
33 * @return
34 */
35 public static void unbinToken()
36 {
37 t.remove();
38 }
39
40
41
42
43 public Survey getSurvey()
44 {
45 return survey;
46 }
47
48 public void setSurvey(Survey survey)
49 {
50 this.survey = survey;
51 }
52
53 }
カスタムデータソース
1 package kite.datasource;
2
3 import java.sql.SQLFeatureNotSupportedException;
4 import java.util.logging.Logger;
5
6 import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
7
8 /**
9 *
10 */
11 public class SurveyparkDataSourceRouter extends AbstractRoutingDataSource
12 {
13
14 protected Object determineCurrentLookupKey()
15 {
16 SurveyToken token = SurveyToken.getCurrentToken();
17
18 if(token != null)
19 {
20 int id = token.getSurvey().getSurveyid();
21 //
22 SurveyToken.unbinToken();
23 return (id % 2) == 0 ? "even":"odd";
24 }
25 return null;
26 }
27
28 public Logger getParentLogger() throws SQLFeatureNotSupportedException
29 {
30 return null;
31 }
32
33 public <T> T unwrap()
34 {
35 return null;
36 }
37
38 public boolean isWrapperFor()
39 {
40 return false;
41 }
42 }
アクションでバインド
//現在のスレッドにバインドされたSurveyToken token=new SurveyToken()token.setSurvey(getCurrentSurvey()); SurveyToken.bindingToken(token);