第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

動(dòng)態(tài)更改Spring數(shù)據(jù)源

動(dòng)態(tài)更改Spring數(shù)據(jù)源

犯罪嫌疑人X 2019-12-26 09:53:57
我有一個(gè)Spring應(yīng)用程序,我想動(dòng)態(tài)更改數(shù)據(jù)源。當(dāng)輸入DS URL時(shí),Spring Bean和所有依賴項(xiàng)將自動(dòng)更新。我知道這有些奇怪,但是無論如何我都想實(shí)現(xiàn)。我的Spring配置如下:<bean id="majorDataSource" class="org.postgresql.ds.PGSimpleDataSource">    <property name="serverName" value="${jdbc.serverName}" />    <property name="portNumber" value="${jdbc.portNumber}" />    <property name="user" value="${jdbc.username}" />    <property name="password" value="${jdbc.password}" />    <property name="databaseName" value="${jdbc.databaseName}" /></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    <property name="dataSource" ref="majorDataSource"/></bean><tx:annotation-driven transaction-manager="transactionManager"/><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    <property name="dataSource" ref="majorDataSource"/>    <property name="configLocation" value="classpath:sqlmap-config.xml"/></bean>問題是:JDBC URL存儲(chǔ)在屬性中,可以在運(yùn)行時(shí)更改。更改URL后,我需要重新創(chuàng)建數(shù)據(jù)源,可能還需要重新創(chuàng)建相關(guān)對(duì)象。我不知道如何在春季優(yōu)雅地做它?我知道Spring確實(shí)可以基于一個(gè)鍵動(dòng)態(tài)路由數(shù)據(jù)源,但是數(shù)據(jù)源URL是在Spring中預(yù)定義的,不會(huì)更改運(yùn)行時(shí)。這不是我的情況。
查看完整描述

3 回答

?
炎炎設(shè)計(jì)

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊

您可以通過擴(kuò)展spring 并覆蓋應(yīng)該返回引用要使用的數(shù)據(jù)源spring bean的鍵的方法來使用spring的AbstractRoutingDataSourcedetermineCurrentLookupKey()。


在spring source的博客上看一下這篇博客文章,它將向您展示如何使用該功能的示例。


基本上要回答您的問題,您需要做的是在XML配置中將兩個(gè)數(shù)據(jù)源定義為不同的spring bean。無需動(dòng)態(tài)創(chuàng)建一個(gè),spring會(huì)同時(shí)加載兩者,并根據(jù)determineCurrentLookupKey()方法中的條件動(dòng)態(tài)使用一個(gè)或另一個(gè)。


這將導(dǎo)致類似:


XML配置


<!-- first data source -->

<bean id="majorDataSource" class="org.postgresql.ds.PGSimpleDataSource">

    <property name="serverName" value="${jdbc.major.serverName}" />

    <property name="portNumber" value="${jdbc.major.portNumber}" />

    <property name="user" value="${jdbc.major.username}" />

    <property name="password" value="${jdbc.major.password}" />

    <property name="databaseName" value="${jdbc.major.databaseName}" />

</bean>

<!-- second data source -->

<bean id="minorDataSource" class="org.postgresql.ds.PGSimpleDataSource">

    <property name="serverName" value="${jdbc.minor.serverName}" />

    <property name="portNumber" value="${jdbc.minor.portNumber}" />

    <property name="user" value="${jdbc.minor.username}" />

    <property name="password" value="${jdbc.minor.password}" />

    <property name="databaseName" value="${jdbc.minor.databaseName}" />

</bean>

<!-- facade data source -->

<bean id="dataSource" class="blog.datasource.CustomerRoutingDataSource">

   <property name="targetDataSources">

      <map>

         <entry key="MINOR" value-ref="minorDataSource"/>

         <entry key="MAJOR" value-ref="majorDataSource"/>

      </map>

   </property>

   <property name="defaultTargetDataSource" ref="majorDataSource"/>

</bean>

<!-- wiring up -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>

</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    <property name="dataSource" ref="dataSource"/>

    <property name="configLocation" value="classpath:sqlmap-config.xml"/>

</bean>

爪哇


public class MyRoutingDataSource extends AbstractRoutingDataSource {

   @Override

   protected Object determineCurrentLookupKey() {

      // get the current url

      HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

      if (request.getRequestURL().toString().endsWith("/minor"))

          return "MINOR";

      else

          return "MAJOR";

   }

}


查看完整回答
反對(duì) 回復(fù) 2019-12-26
?
德瑪西亞99

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊

我不確定這是否是正確的方法,但是您可以做的是這樣的事情。


<bean id="majorDataSource" class="org.postgresql.ds.PGSimpleDataSource">

    <property name="serverName" value="dummydata" />

    <property name="portNumber" value="dummydata" />

    <property name="user" value="dummydata" />

    <property name="password" value="dummydata" />

    <property name="databaseName" value="dummydata" />

</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="majorDataSource"/>

</bean>


<tx:annotation-driven transaction-manager="transactionManager"/>

并且在Java類中


public class TestTransaction {


   @Autowired

   private DataSourceTransactionManager manager;


   private PlatformTransactionManager transactionManager;


   public testExecution(DataSource ds) {

       manager.setDataSource(ds);

       transactionManager = manager;

       TransactionDefinition def = new DefaultTransactionDefinition();

       TransactionStatus status = transactionManager.getTransaction(def);

       try {

           jdbcTemplate.update();

           transactionManager.commit(status);

       } catch (Exception ex) {

           transactionManager.rollback(status);

       }

   }

}

請(qǐng)建議這種方法是否可以工作,因?yàn)槲疫€是Spring的新手


查看完整回答
反對(duì) 回復(fù) 2019-12-26
?
慕尼黑的夜晚無繁華

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊

我使用主要數(shù)據(jù)庫和次要數(shù)據(jù)庫進(jìn)行故障轉(zhuǎn)移。當(dāng)主要數(shù)據(jù)庫失敗時(shí),我將提升次要數(shù)據(jù)庫為主要數(shù)據(jù)庫。然后,我需要設(shè)置第三個(gè)數(shù)據(jù)庫作為備用數(shù)據(jù)庫,其URL將是動(dòng)態(tài)的,無法在此處預(yù)定義。無論如何,也許我可以強(qiáng)制對(duì)主要數(shù)據(jù)庫和次要數(shù)據(jù)庫使用靜態(tài)IP,因此無需動(dòng)態(tài)更改URL。

查看完整回答
反對(duì) 回復(fù) 2019-12-26
  • 3 回答
  • 0 關(guān)注
  • 534 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)