Files
TimiServerAPI/src/main/java/com/imyeyu/api/config/dbsource/TimiServerDBConfig.java
2025-07-22 15:26:14 +08:00

123 lines
4.6 KiB
Java

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<Resource> resources = new ArrayList<>();
{
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
List<String> 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);
}
}