SpringBoot整合阿里Druid數(shù)據(jù)源及Spring-Data-Jpa

最近開辟了一個(gè)新項(xiàng)目,因?yàn)槌跗诳紤]到可能會(huì)調(diào)整數(shù)據(jù)庫的風(fēng)險(xiǎn),所以orm,在設(shè)計(jì)之初就考慮為Spring Data Jpa, 以下是工程data層數(shù)據(jù),整體是參照配置多數(shù)據(jù)源的方案,進(jìn)行配置的

目錄

  • 因?yàn)榘⒗飻?shù)據(jù)源Druid
  • 整合數(shù)據(jù)源及其他事務(wù)配置
  • pom依賴

整合事務(wù)

@EnableAutoConfiguration
@SpringBootApplication
@EnableTransactionManagement
@ComponentScan(basePackages = {"com.inn.developer"})
public class CodeApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder().web(true).sources(CodeApplication.class).run(args);
    }
}

創(chuàng)建DruidProperties配置

@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "druid")
public class DruidProperties {
...

數(shù)據(jù)庫參數(shù)可以參考:

參數(shù) 默認(rèn)值 解釋
initialSize 3 初始化配置
minIdle 3 最小連接數(shù)
maxActive 15 最大連接數(shù)
maxWait 5000 獲取連接超時(shí)時(shí)間(單位:ms)
timeBetweenEvictionRunsMillis 90000 連接有效性檢測(cè)時(shí)間(單位:ms)
testOnBorrow false 獲取連接檢測(cè)
testOnReturn false 歸還連接檢測(cè)
minEvictableIdleTimeMillis 1800000 最大空閑時(shí)間(單位ms)
testWhileIdle true 在獲取連接后阳仔,確定是否要進(jìn)行連接空間時(shí)間的檢查
  • 配置說明:

1:minEvictableIdleTimeMillis(最大空閑時(shí)間):默認(rèn)為30分鐘笼才,配置里面不進(jìn)行設(shè)置食绿。

2:testOnBorrow ,testOnReturn 默認(rèn)為關(guān)閉贵白,可以設(shè)置為不配置。

3:testWhileIdle(在獲取連接后诚些,確定是否要進(jìn)行連接空閑時(shí)間的檢查)汤踏。默認(rèn)為true涝涤。配置里面不再進(jìn)行設(shè)置谚赎。

  • 流程說明:

1:在第一次調(diào)用connection的時(shí)候淫僻,才會(huì)進(jìn)行 initialSize的初始化。

2:心跳檢測(cè)時(shí)間線程壶唤,會(huì)休眠timeBetweenEvictionRunsMillis時(shí)間雳灵,然后只對(duì)(沒有borrow的線程 減去 minIdle)的線程進(jìn)行檢查,如果空閑時(shí)間大于minEvictableIdleTimeMillis則進(jìn)行close闸盔。

3:testWhileIdle必須設(shè)置為true悯辙,在獲取到連接后,先檢查testOnBorrow迎吵,然后再判定testwhileIdle躲撰,如果連接空閑時(shí)間大于timeBetweenEvictionRunsMillis,則會(huì)進(jìn)行心跳檢測(cè)钓觉。

4:不需要配置validationQuery茴肥,如果不配置的情況下會(huì)走ping命令坚踩,性能更高荡灾。

5:連接保存在數(shù)組里面,獲取連接的時(shí)候瞬铸,獲取數(shù)組的最后一位批幌。在imeBetweenEvictionRunsMillis時(shí)是從前往后進(jìn)行檢查連接的有效性。

配置數(shù)據(jù)源及hibernate適配

數(shù)據(jù)源對(duì)象創(chuàng)建還是和之前一樣,
筆者不太喜歡xml的方式,所以還是采用配置類

DruidAutoJpaConfiguration

@Configuration
@EnableConfigurationProperties(DruidProperties.class)//開啟屬性注入,通過@autowired注入
@ConditionalOnClass(DruidDataSource.class)//表示對(duì)應(yīng)的類在classpath目錄下存在時(shí)嗓节,才會(huì)去解析對(duì)應(yīng)的配置文件
@ConditionalOnProperty(prefix = "druid", name = "url")
@EnableJpaRepositories(basePackages = "com.inn.developer.model.dao",transactionManagerRef = "jpaTransactionManager", entityManagerFactoryRef = "localContainerEntityManagerFactoryBean")
public class DruidAutoJpaConfiguration {
    @Autowired
    private DruidProperties properties;

    @Bean(name = "druidDataSource")
    @Primary
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        dataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
        if (properties.getInitialSize() > 0) {
            dataSource.setInitialSize(properties.getInitialSize());
        }
        if (properties.getMinIdle() > 0) {
            dataSource.setMinIdle(properties.getMinIdle());
        }
        if (properties.getMaxActive() > 0) {
            dataSource.setMaxActive(properties.getMaxActive());
        }
        dataSource.setTestOnBorrow(properties.isTestOnBorrow());
        dataSource.setValidationQuery("select version()");
        try {
            dataSource.init();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return dataSource;
    }


    /**
     * hibernate 適配器,定制方言為mysql,并打印sql
     *
     * @return
     */
    @Bean(name = "hibernateJpaVendorAdapter")
    @Primary
    public HibernateJpaVendorAdapter hibernateJpaVendorAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setShowSql(true);
        hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");
        return hibernateJpaVendorAdapter;
    }

    @Bean(name = "localContainerEntityManagerFactoryBean")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(@Qualifier("druidDataSource") DataSource dataSource
            ,@Qualifier("hibernateJpaVendorAdapter") HibernateJpaVendorAdapter hibernateJpaVendorAdapter) {
        LocalContainerEntityManagerFactoryBean local = new LocalContainerEntityManagerFactoryBean();
        local.setDataSource(dataSource);
        local.setJpaVendorAdapter(hibernateJpaVendorAdapter);
        local.setPackagesToScan("com.inn.developer.model.domain");
        Properties properties = new Properties();
        properties.put("hibernate.format_sql", true);
        properties.put("hibernate.hbm2ddl.auto", "update");
        local.setJpaProperties(properties);
        return local;
    }

    @Bean(name = "jpaTransactionManager")
    @Primary
    public JpaTransactionManager jpaTransactionManager(@Qualifier("localContainerEntityManagerFactoryBean") LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        EntityManagerFactory object = entityManagerFactoryBean.getObject();
        jpaTransactionManager.setEntityManagerFactory(object);
        return jpaTransactionManager;
    }

pom依賴

 <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        
         <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.6</version>
            <scope>provided</scope>
        </dependency>
        
          <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.11</version>
        </dependency>
        
         <!--依賴Spring 4.3.6之core荧缘、context、aop拦宣、beans截粗、tx信姓、orm和spring data commons -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.11.3.RELEASE</version>
        </dependency>

        <!--hibernate 實(shí)現(xiàn)JPA的框架 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.2.5.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.11.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.5.6-Final</version>
        </dependency>        
                


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绸罗,隨后出現(xiàn)的幾起案子意推,更是在濱河造成了極大的恐慌,老刑警劉巖珊蟀,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菊值,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡育灸,警方通過查閱死者的電腦和手機(jī)腻窒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磅崭,“玉大人儿子,你說我怎么就攤上這事≌莱希” “怎么了典徊?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)恩够。 經(jīng)常有香客問我卒落,道長(zhǎng),這世上最難降的妖魔是什么蜂桶? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任儡毕,我火速辦了婚禮,結(jié)果婚禮上扑媚,老公的妹妹穿的比我還像新娘腰湾。我一直安慰自己,他們只是感情好疆股,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布费坊。 她就那樣靜靜地躺著,像睡著了一般旬痹。 火紅的嫁衣襯著肌膚如雪附井。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天两残,我揣著相機(jī)與錄音永毅,去河邊找鬼。 笑死人弓,一個(gè)胖子當(dāng)著我的面吹牛沼死,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崔赌,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼意蛀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼耸别!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起县钥,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤太雨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后魁蒜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囊扳,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年兜看,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锥咸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡细移,死狀恐怖搏予,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弧轧,我是刑警寧澤雪侥,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站精绎,受9級(jí)特大地震影響速缨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜代乃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一旬牲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搁吓,春花似錦原茅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摩骨,卻和暖如春通贞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仿吞。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工滑频, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捡偏,地道東北人唤冈。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像银伟,于是被迫代替她去往敵國和親你虹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绘搞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355