package com.imyeyu.api.config.dbsource; import com.zaxxer.hikari.HikariDataSource; import com.imyeyu.utils.Time; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.type.EnumTypeHandler; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /** * TimiServer 数据源 * * @author 夜雨 * @since 2022-11-29 22:40 */ @Configuration @MapperScan(basePackages = { "com.imyeyu.api.modules.git.mapper", "com.imyeyu.api.modules.bill.mapper", "com.imyeyu.api.modules.blog.mapper", "com.imyeyu.api.modules.lyric.mapper", "com.imyeyu.api.modules.mirror.mapper", "com.imyeyu.api.modules.system.mapper", "com.imyeyu.api.modules.common.mapper", "com.imyeyu.api.modules.minecraft.mapper" }, sqlSessionFactoryRef = "timiServerSqlSessionFactory") public class TimiServerDBConfig { public static final String ROLLBACKER = "timiServerTransactionManager"; @Bean(name = "timiServerDataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource.timiserver") public DataSource getPrimaryDateSource() throws SQLException { HikariDataSource dataSource = new HikariDataSource(); dataSource.setAutoCommit(true); dataSource.setMinimumIdle(10); dataSource.setMaximumPoolSize(100); dataSource.setConnectionTestQuery("SELECT 1"); dataSource.setMaxLifetime(Time.S * 180); dataSource.setIdleTimeout(Time.S * 120); dataSource.setLoginTimeout(5); dataSource.setValidationTimeout(Time.S * 3); dataSource.setConnectionTimeout(Time.S * 8); dataSource.setLeakDetectionThreshold(Time.S * 180); return dataSource; } @Bean(name = "timiServerSqlSessionFactory") @Primary public SqlSessionFactory primarySqlSessionFactory(@Qualifier("timiServerDataSource") DataSource datasource) throws Exception { org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration(); config.setUseGeneratedKeys(true); config.setMapUnderscoreToCamelCase(true); config.setDefaultEnumTypeHandler(EnumTypeHandler.class); List resources = new ArrayList<>(); { ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); List mapperLocations = new ArrayList<>(); mapperLocations.add("classpath:mapper/git/**/*.xml"); mapperLocations.add("classpath:mapper/blog/**/*.xml"); mapperLocations.add("classpath:mapper/common/**/*.xml"); mapperLocations.add("classpath:mapper/system/**/*.xml"); mapperLocations.add("classpath:mapper/minecraft/**/*.xml"); for (int i = 0; i < mapperLocations.size(); i++) { resources.addAll(List.of(resourceResolver.getResources(mapperLocations.get(i)))); } } String[] typeAliases = { "com.imyeyu.api.modules.git.entity", "com.imyeyu.api.modules.bill.entity", "com.imyeyu.api.modules.blog.entity", "com.imyeyu.api.modules.lyric.entity", "com.imyeyu.api.modules.mirror.entity", "com.imyeyu.api.modules.system.entity", "com.imyeyu.api.modules.common.entity", "com.imyeyu.api.modules.minecraft.entity" }; String[] typeHandlers = { "com.imyeyu.api.handler" }; SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(datasource); bean.setConfiguration(config); bean.setMapperLocations(resources.toArray(new Resource[0])); bean.setTypeAliasesPackage(String.join(",", typeAliases)); bean.setTypeHandlersPackage(String.join(",", typeHandlers)); return bean.getObject(); } @Bean("timiServerSqlSessionTemplate") @Primary public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("timiServerSqlSessionFactory") SqlSessionFactory sessionfactory) { return new SqlSessionTemplate(sessionfactory); } @Bean(name = "timiServerTransactionManager") public PlatformTransactionManager txManager(@Qualifier("timiServerDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }