最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解基于Spring Boot與Spring Data JPA的多數(shù)據(jù)源配置

 更新時間:2017年05月19日 16:38:41   作者:gabriel_2  
本篇文章主要介紹了詳解基于Spring Boot與Spring Data JPA的多數(shù)據(jù)源配置,非常具有實用價值,需要的朋友可以參考下

由于項目需要,最近研究了一下基于spring Boot與Spring Data JPA的多數(shù)據(jù)源配置問題。以下是傳統(tǒng)的單數(shù)據(jù)源配置代碼。這里使用的是Spring的Annotation在代碼內(nèi)部直接配置的方式,沒有使用任何XML文件。

@Configuration 
@EnableJpaRepositories(basePackages = "org.lyndon.repository") 
@EnableTransactionManagement 
@PropertySource("classpath:application.properties") 
public class JpaConfig { 
   
  private static final String DATABASE_DRIVER = "db.driver"; 
  private static final String DATABASE_URL = "db.url"; 
  private static final String DATABASE_USER = "db.user"; 
  private static final String DATABASE_PASSWORD = "db.password"; 
  private static final String PACKAGES_TO_SCAN = "packages.to.scan"; 
  private static final String HIBERNATE_DIALECT = "hibernate.dialect"; 
  private static final String HIBERNATE_SHOW_SQL = "hibernate.show.sql"; 
   
  @Resource 
  private Environment env; 
   
  @Bean 
  public DataSource dataSource() { 
    DruidDataSource source = new DruidDataSource(); 
    source.setDriverClassName(env.getRequiredProperty(DATABASE_DRIVER)); 
    source.setUrl(env.getRequiredProperty(DATABASE_URL)); 
    source.setUsername(env.getRequiredProperty(DATABASE_USER)); 
    source.setPassword(env.getRequiredProperty(DATABASE_PASSWORD)); 
    return source; 
  } 
   
  @Bean 
  public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
    factory.setDataSource(dataSource()); 
    factory.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
    factory.setPackagesToScan(env.getRequiredProperty(PACKAGES_TO_SCAN)); 
    factory.setJpaProperties(hibernateProperties()); 
    factory.afterPropertiesSet(); 
    return factory; 
  } 
   
  @Bean 
  public PlatformTransactionManager transactionManager() { 
    JpaTransactionManager manager = new JpaTransactionManager(); 
    manager.setEntityManagerFactory(entityManagerFactory().getObject()); 
    return manager; 
  } 
   
  @Bean 
  public HibernateExceptionTranslator hibernateExceptionTranslator() { 
    return new HibernateExceptionTranslator(); 
  } 
   
  private Properties hibernateProperties() { 
    Properties properties = new Properties(); 
    properties.put(HIBERNATE_DIALECT, env.getRequiredProperty(HIBERNATE_DIALECT)); 
    properties.put(HIBERNATE_SHOW_SQL, env.getRequiredProperty(HIBERNATE_SHOW_SQL)); 
    return properties; 
  } 
   
} 

但是這一配置是不能簡單地擴展到多數(shù)據(jù)源配置的,因為Spring Boot默認(rèn)會為開發(fā)人員做很多工作,而這些工作與多數(shù)據(jù)源的配置相沖突,因此需要修改原來的配置內(nèi)容。網(wǎng)上有很多講解多數(shù)據(jù)源配置的文章,但是這些文章大多使用的是XML配置的方式,而且沒有使用Spring Boot等比較新的Spring框架技術(shù)(比如很多人使用實現(xiàn)AbstractRoutingDataSource這一Spring提供的抽象類的方式,還需要切面的支持,無疑是相當(dāng)繁瑣的),已經(jīng)不適用于在最新的工程項目中使用了,因為最新的Spring框架可以為我們完成很多事情,我們只需要去適應(yīng)新的方法即可。為此,我通過研究Spring的官方文檔和不斷調(diào)試,實現(xiàn)了新的多數(shù)據(jù)源配置的方法,在此貼出,僅供參考。

首先,Spring的JPA是直接支持多數(shù)據(jù)源配置的,因此我們可以在配置文件或者代碼中直接配置多個數(shù)據(jù)源。由于多數(shù)據(jù)源配置可能會共享一些配置信息,因此使用繼承體系實現(xiàn)這種配置是最合適的。在例子中,我的ORM框架使用的是hibernate,而與Hibernate相關(guān)的配置信息我都放在了配置基類BaseJpaConfg中,代碼如下。

@Configuration 
@EnableTransactionManagement 
@PropertySource("classpath:application.properties") 
public class BaseJpaConfig { 
 
  private static final String HIBERNATE_DIALECT = "hibernate.dialect"; 
  private static final String HIBERNATE_SHOW_SQL = "hibernate.show.sql"; 
 
  @Resource 
  protected Environment env; 
 
  @Bean 
  public HibernateExceptionTranslator hibernateExceptionTranslator() { 
    return new HibernateExceptionTranslator(); 
  } 
 
  protected Properties hibernateProperties() { 
    Properties properties = new Properties(); 
    properties.put(HIBERNATE_DIALECT, env.getRequiredProperty(HIBERNATE_DIALECT)); 
    properties.put(HIBERNATE_SHOW_SQL, env.getRequiredProperty(HIBERNATE_SHOW_SQL)); 
    return properties; 
  } 
 
} 

該類提供Hibernate相關(guān)信息。它有兩個子類,分別是SpringJpaConfig以及MysqlJpaConfig,分別配置了兩個數(shù)據(jù)源,連接到兩個不同的數(shù)據(jù)庫Schema,代碼如下。

@Configuration 
@EnableJpaRepositories(basePackages = {"org.lyndon.repository1"}, entityManagerFactoryRef = "springEntityManagerFactory", 
    transactionManagerRef = "springTransactionManager") 
public class SpringJpaConfig extends BaseJpaConfig { 
 
  private static final String DATABASE_DRIVER = "db.driver"; 
  private static final String DATABASE_URL = "db.url"; 
  private static final String DATABASE_USER = "db.user"; 
  private static final String DATABASE_PASSWORD = "db.password"; 
  private static final String PACKAGES_TO_SCAN = "packages.to.scan"; 
 
  @Bean 
  @ConfigurationProperties(prefix = "datasource.primary") 
  public DataSource dataSource() { 
    DruidDataSource source = new DruidDataSource(); 
    source.setDriverClassName(env.getRequiredProperty(DATABASE_DRIVER)); 
    source.setUrl(env.getRequiredProperty(DATABASE_URL)); 
    source.setUsername(env.getRequiredProperty(DATABASE_USER)); 
    source.setPassword(env.getRequiredProperty(DATABASE_PASSWORD)); 
    return source; 
  } 
 
  @Bean(name = "springEntityManagerFactory") 
  public LocalContainerEntityManagerFactoryBean springEntityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
    factory.setDataSource(dataSource()); 
    factory.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
    factory.setPackagesToScan(env.getRequiredProperty(PACKAGES_TO_SCAN).split(",")); 
    factory.setJpaProperties(hibernateProperties()); 
    factory.afterPropertiesSet(); 
    return factory; 
  } 
 
  @Bean(name = "springTransactionManager") 
  @Primary 
  public PlatformTransactionManager transactionManager() { 
    JpaTransactionManager manager = new JpaTransactionManager(); 
    manager.setEntityManagerFactory(springEntityManagerFactory().getObject()); 
    return manager; 
  } 
 
} 
@Configuration 
@EnableJpaRepositories(basePackages = {"org.lyndon.repository2"}, entityManagerFactoryRef = "mysqlEntityManagerFactory", 
    transactionManagerRef = "mysqlTransactionManager") 
public class MysqlJpaConfig extends BaseJpaConfig { 
 
  private static final String DATABASE_DRIVER = "db.driver"; 
  private static final String DATABASE_URL = "db.url2"; 
  private static final String DATABASE_USER = "db.user"; 
  private static final String DATABASE_PASSWORD = "db.password"; 
  private static final String PACKAGES_TO_SCAN = "packages.to.scan2"; 
 
  @Bean 
  @ConfigurationProperties(prefix = "datasource.secondary") 
  public DataSource dataSource2() { 
    DruidDataSource source = new DruidDataSource(); 
    source.setDriverClassName(env.getRequiredProperty(DATABASE_DRIVER)); 
    source.setUrl(env.getRequiredProperty(DATABASE_URL)); 
    source.setUsername(env.getRequiredProperty(DATABASE_USER)); 
    source.setPassword(env.getRequiredProperty(DATABASE_PASSWORD)); 
    return source; 
  } 
 
  @Bean(name = "mysqlEntityManagerFactory") 
  public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
    factory.setDataSource(dataSource2()); 
    factory.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
    factory.setPackagesToScan(env.getRequiredProperty(PACKAGES_TO_SCAN).split(",")); 
    factory.setJpaProperties(hibernateProperties()); 
    factory.afterPropertiesSet(); 
    return factory; 
  } 
 
  @Bean(name = "mysqlTransactionManager") 
  public PlatformTransactionManager transactionManager() { 
    JpaTransactionManager manager = new JpaTransactionManager(); 
    manager.setEntityManagerFactory(mysqlEntityManagerFactory().getObject()); 
    return manager; 
  } 
 
} 

兩份配置代碼使用了各自的數(shù)據(jù)源、實體管理對象以及事務(wù)管理對象。這里要注意的有兩點,首先是實體管理對象。Spring Boot框架為方便開發(fā)者,默認(rèn)會尋找名為“entityManagerFactory”的Bean作為實體管理的實現(xiàn),但是我們這里使用了兩個實體管理對象,名稱也并不是默認(rèn)的“entityManagerFactory”,因此必須在各自的EnableJpaRepositories的Annotation中指明使用的實體管理對象。第二點,就是事務(wù)管理對象。Spring Boot會提供一個默認(rèn)的事務(wù)管理對象的實現(xiàn),但是我們在這里使用了兩個不同的事務(wù)管理對象,因此我們也需要在各自的EnableJpaRepositories的Annotation中指明使用的事務(wù)管理對象。除此以外,我們還必須指定其中一個事務(wù)管理對象為主要對象(使用Primary這一Annotation),讓Spring能有主次地使用相應(yīng)的事務(wù)管理對象。

以上就是本文的主要內(nèi)容。關(guān)于Service的配置等問題,由于和單數(shù)據(jù)源時是一樣的,因此就不再贅述了?;谏鲜龃a,我們就可以使用Spring Boot實現(xiàn)多數(shù)據(jù)源之間的無縫切換了,是不是很輕松?如果你不想使用代碼配置的方式,也可以使用XML文件代替,配置的核心屬性與上文相同,可以自己加以琢磨。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis?Lombok使用方法與復(fù)雜查詢介紹

    Mybatis?Lombok使用方法與復(fù)雜查詢介紹

    Lombok是一種Java實用工具,可用來幫助開發(fā)人員消除Java的冗長,尤其是對于簡單的Java對象(POJO),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • Java 全排列的幾種實現(xiàn)方法

    Java 全排列的幾種實現(xiàn)方法

    本文詳細介紹了Java中全排列問題的幾種實現(xiàn)方法,包括回溯法、字典序排列法和迭代法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • spring-boot中的SPI機制實例講解

    spring-boot中的SPI機制實例講解

    這篇文章主要介紹了spring-boot中的SPI機制實例講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring容器注入bean的五種方法逐個解析

    Spring容器注入bean的五種方法逐個解析

    依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個概念。具體含義是:當(dāng)某個角色(可能是一個Java實例,調(diào)用者)需要另一個角色(另一個Java實例,被調(diào)用者)的協(xié)助時,在傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例
    2023-02-02
  • java多線程編程之從線程返回數(shù)據(jù)的兩種方法

    java多線程編程之從線程返回數(shù)據(jù)的兩種方法

    從線程中返回數(shù)據(jù)和向線程傳遞數(shù)據(jù)類似。也可以通過類成員以及回調(diào)函數(shù)來返回數(shù)據(jù)。但類成員在返回數(shù)據(jù)和傳遞數(shù)據(jù)時有一些區(qū)別,下面讓我們來看看它們區(qū)別在哪
    2014-01-01
  • Java之dao模式詳解及代碼示例

    Java之dao模式詳解及代碼示例

    這篇文章主要介紹了Java之dao模式詳解及代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 詳解Java如何簡化條件表達式

    詳解Java如何簡化條件表達式

    在復(fù)雜的實際業(yè)務(wù)中,往往會出現(xiàn)各種嵌套的條件判斷邏輯。隨著需求的增加,條件邏輯會變得越來越復(fù)雜。面對這種情況,簡化判斷邏輯就是不得不做的事情,下面為大家介紹幾種方法
    2022-06-06
  • 淺析Java虛擬機詳解之概述、對象生存法則

    淺析Java虛擬機詳解之概述、對象生存法則

    這篇文章主要介紹了Java虛擬機詳解之概述、對象生存法則,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java基于ShardingSphere實現(xiàn)分庫分表的實例詳解

    Java基于ShardingSphere實現(xiàn)分庫分表的實例詳解

    ShardingSphere?已于2020年4月16日成為?Apache?軟件基金會的頂級項目,?它們均提供標(biāo)準(zhǔn)化的數(shù)據(jù)水平擴展、分布式事務(wù)和分布式治理等功能,可適用于如?Java?同構(gòu)、異構(gòu)語言、云原生等各種多樣化的應(yīng)用場景,對ShardingSphere分庫分表相關(guān)知識感興趣的朋友一起看看吧
    2022-03-03
  • Java關(guān)于JDK1.8中的Optional類

    Java關(guān)于JDK1.8中的Optional類

    本文主要介紹了Optional類的一些常用方法,以及其應(yīng)用場景,其主要是為了規(guī)避空指針異常(NPE)。熟練的運用Optional類可以很大的簡化我們的代碼,使代碼簡潔明了。,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09

最新評論

前郭尔| 丹棱县| 根河市| 利川市| 潜江市| 托克逊县| 平乐县| 阿尔山市| 龙州县| 广平县| 晋中市| 静安区| 台湾省| 锡林郭勒盟| 辉南县| 河间市| 阳曲县| 南通市| 社会| 额敏县| 屏东市| 维西| 桓仁| 资溪县| 仙游县| 交城县| 馆陶县| 平顺县| 论坛| 赣州市| 阿鲁科尔沁旗| 闸北区| 黔西县| 邵阳县| 隆安县| 长泰县| 平陆县| 息烽县| 无为县| 塘沽区| 乌拉特前旗|