Skip to content

Commit

Permalink
[#9765] Refactor MyBatis configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
emeroad committed Mar 20, 2023
1 parent 2ebb685 commit e8367a9
Show file tree
Hide file tree
Showing 15 changed files with 342 additions and 275 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import com.navercorp.pinpoint.metric.collector.cache.MetricCacheConfiguration;
import com.navercorp.pinpoint.metric.collector.config.MetricCollectorPinotDaoConfiguration;
import com.navercorp.pinpoint.metric.collector.config.MetricKafkaConfiguration;
import com.navercorp.pinpoint.pinot.config.PinotConfiguration;
import org.springframework.boot.SpringBootConfiguration;
Expand All @@ -12,7 +13,6 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.Profile;


Expand All @@ -26,13 +26,11 @@
"com.navercorp.pinpoint.common.server.util",
"com.navercorp.pinpoint.metric.collector.controller"
})
@ImportResource({
"classpath:pinot-collector/applicationContext-collector-pinot-dao-config.xml"
})
@Import({
MetricAppPropertySources.class,
MetricCacheConfiguration.class,
PinotConfiguration.class,
MetricCollectorPinotDaoConfiguration.class,
MetricKafkaConfiguration.class
})
@Profile("metric")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.navercorp.pinpoint.metric.collector.config;

import com.navercorp.pinpoint.metric.common.config.MetricSqlSessionFactoryBuilder;
import com.navercorp.pinpoint.pinot.mybatis.MyBatisConfiguration;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionManager;

import javax.sql.DataSource;

/**
* @author Woonduk Kang(emeroad)
*/
@org.springframework.context.annotation.Configuration
public class MetricCollectorPinotDaoConfiguration {
private final Logger logger = LogManager.getLogger(MetricCollectorPinotDaoConfiguration.class);

@Bean
public TransactionManager pinotTransactionManager(@Qualifier("pinotDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}


@Bean
public SqlSessionFactory sqlPinotSessionFactory(
@Qualifier("pinotDataSource") DataSource dataSource,
@Value("classpath*:/pinot-collector/mapper/pinot/*Mapper.xml") Resource[] mappers) throws Exception {

for (Resource mapper : mappers) {
logger.info("Mapper location: {}", mapper.getDescription());
}

MetricSqlSessionFactoryBuilder factory = new MetricSqlSessionFactoryBuilder();
factory.setDataSource(dataSource);
factory.setMappers(mappers);

Configuration config = MyBatisConfiguration.defaultConfiguration();
factory.setConfiguration(config);

factory.registerCommonTypeAlias();
factory.registerCommonTypeHandler();
factory.setTransactionFactory(new ManagedTransactionFactory());
return factory.build();
}


@Bean
public SqlSessionTemplate sqlPinotSessionTemplate(
@Qualifier("sqlPinotSessionFactory") SqlSessionFactory sessionFactory) {
return new SqlSessionTemplate(sessionFactory);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package com.navercorp.pinpoint.metric.common.config;

import com.navercorp.pinpoint.metric.common.model.DoubleMetric;
import com.navercorp.pinpoint.metric.common.model.MetricData;
import com.navercorp.pinpoint.metric.common.model.MetricDataName;
import com.navercorp.pinpoint.metric.common.model.MetricDataType;
import com.navercorp.pinpoint.metric.common.model.MetricTag;
import com.navercorp.pinpoint.metric.common.model.MetricTagKey;
import com.navercorp.pinpoint.metric.common.model.Tag;
import com.navercorp.pinpoint.metric.common.model.mybatis.MetricDataTypeHandler;
import com.navercorp.pinpoint.metric.web.dao.model.HostInfoSearchKey;
import com.navercorp.pinpoint.metric.web.dao.model.MetricInfoSearchKey;
import com.navercorp.pinpoint.metric.web.dao.model.MetricTagsSearchKey;
import com.navercorp.pinpoint.metric.web.dao.model.SystemMetricDataSearchKey;
import com.navercorp.pinpoint.metric.web.model.SampledSystemMetric;
import com.navercorp.pinpoint.metric.web.model.chart.SystemMetricPoint;
import com.navercorp.pinpoint.metric.web.mybatis.typehandler.DoubleToLongTypeHandler;
import com.navercorp.pinpoint.metric.web.mybatis.typehandler.DoubleTypeHandler;
import com.navercorp.pinpoint.metric.web.mybatis.typehandler.LongTypeHandler;
import com.navercorp.pinpoint.metric.web.mybatis.typehandler.TagListTypeHandler;
import com.navercorp.pinpoint.metric.web.mybatis.typehandler.TagTypeHandler;
import com.navercorp.pinpoint.metric.web.util.MetricsQueryParameter;
import com.navercorp.pinpoint.metric.web.util.Range;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.type.TypeAliasRegistry;
import org.apache.ibatis.type.TypeHandlerRegistry;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.Resource;

import javax.sql.DataSource;
import java.util.List;

/**
* @author Woonduk Kang(emeroad)
*/
public class MetricSqlSessionFactoryBuilder {

private DataSource dataSource;
private TransactionFactory transactionFactory;
private Resource[] mappers;
private Configuration configuration;

public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}

public void setTransactionFactory(TransactionFactory transactionFactory) {
this.transactionFactory = transactionFactory;
}

public void setMappers(Resource[] mappers) {
this.mappers = mappers;
}

public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}

@Bean
public SqlSessionFactory build() throws Exception {

SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setConfiguration(configuration);
sessionFactoryBean.setMapperLocations(mappers);
sessionFactoryBean.setFailFast(true);
sessionFactoryBean.setTransactionFactory(transactionFactory);
return sessionFactoryBean.getObject();
}

public void registerCommonTypeAlias() {
TypeAliasRegistry typeAliasRegistry = this.configuration.getTypeAliasRegistry();
typeAliasRegistry.registerAlias("Number", Number.class);

typeAliasRegistry.registerAlias("Tag", Tag.class);
typeAliasRegistry.registerAlias("DoubleMetric", DoubleMetric.class);
typeAliasRegistry.registerAlias("MetricData", MetricData.class);
typeAliasRegistry.registerAlias("MetricDataName", MetricDataName.class);
typeAliasRegistry.registerAlias("MetricDataType", MetricDataType.class);
typeAliasRegistry.registerAlias("MetricTag", MetricTag.class);
typeAliasRegistry.registerAlias("MetricTagKey", MetricTagKey.class);
typeAliasRegistry.registerAlias("MetricDataTypeHandler", MetricDataTypeHandler.class);
typeAliasRegistry.registerAlias("TagListTypeHandler", com.navercorp.pinpoint.metric.common.model.mybatis.TagListTypeHandler.class);

}

public void registerWebTypeAlias() {
registerCommonTypeAlias();

TypeAliasRegistry typeAliasRegistry = this.configuration.getTypeAliasRegistry();
typeAliasRegistry.registerAlias("Range", Range.class);
typeAliasRegistry.registerAlias("MetricsQueryParameter", MetricsQueryParameter.class);
typeAliasRegistry.registerAlias("DoubleHandler", DoubleTypeHandler.class);
typeAliasRegistry.registerAlias("LongHandler", LongTypeHandler.class);
typeAliasRegistry.registerAlias("DoubleToLongHandler", DoubleToLongTypeHandler.class);
typeAliasRegistry.registerAlias("TagHandler", TagTypeHandler.class);
typeAliasRegistry.registerAlias("TagListHandler", TagListTypeHandler.class);
typeAliasRegistry.registerAlias("SampledSystemMetric", SampledSystemMetric.class);
typeAliasRegistry.registerAlias("SystemMetricPoint", SystemMetricPoint.class);
typeAliasRegistry.registerAlias("systemMetricDataSearchKey", SystemMetricDataSearchKey.class);
typeAliasRegistry.registerAlias("metricInfoSearchKey", MetricInfoSearchKey.class);
typeAliasRegistry.registerAlias("metricTagsSearchKey", MetricTagsSearchKey.class);
typeAliasRegistry.registerAlias("hostInfoSearchKey", HostInfoSearchKey.class);
}

public void registerCommonTypeHandler() {
TypeHandlerRegistry typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
typeHandlerRegistry.register(MetricDataType.class, MetricDataTypeHandler.class);
typeHandlerRegistry.register(List.class, com.navercorp.pinpoint.metric.common.model.mybatis.TagListTypeHandler.class);


}

public void registerWebTypeHandler() {
registerCommonTypeHandler();


TypeHandlerRegistry typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
//--- web
typeHandlerRegistry.register(Number.class, DoubleTypeHandler.class);
typeHandlerRegistry.register(Number.class, LongTypeHandler.class);
typeHandlerRegistry.register(Number.class, DoubleToLongTypeHandler.class);
typeHandlerRegistry.register(Tag.class, TagTypeHandler.class);
typeHandlerRegistry.register(List.class, TagListTypeHandler.class);
}

}
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
package com.navercorp.pinpoint.metric.web;


import com.navercorp.pinpoint.metric.web.config.MetricWebPinotDaoConfiguration;
import com.navercorp.pinpoint.pinot.config.PinotConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.Profile;

@ComponentScan(basePackages = {
"com.navercorp.pinpoint.metric.web",
"com.navercorp.pinpoint.common.server.util"
})
@ImportResource({
"classpath:/pinot-web/applicationContext-web-pinot-dao-config.xml"
})
@Import({
WebMetricPropertySources.class,
MetricWebPinotDaoConfiguration.class,
PinotConfiguration.class
})
@Profile("metric")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.navercorp.pinpoint.metric.web.config;

import com.navercorp.pinpoint.metric.common.config.MetricSqlSessionFactoryBuilder;
import com.navercorp.pinpoint.pinot.mybatis.MyBatisConfiguration;
import com.navercorp.pinpoint.pinot.mybatis.PinotAsyncTemplate;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionManager;

import javax.sql.DataSource;

/**
* @author Woonduk Kang(emeroad)
*/
@org.springframework.context.annotation.Configuration
public class MetricWebPinotDaoConfiguration {
private final Logger logger = LogManager.getLogger(MetricWebPinotDaoConfiguration.class);

@Bean
public TransactionManager pinotTransactionManager(@Qualifier("pinotDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}


@Bean
public SqlSessionFactory sqlPinotSessionFactory(
@Qualifier("pinotDataSource") DataSource dataSource,
@Value("classpath*:/pinot-web/mapper/pinot/*Mapper.xml") Resource[] mappers) throws Exception {

for (Resource mapper : mappers) {
logger.info("Mapper location: {}", mapper.getDescription());
}

MetricSqlSessionFactoryBuilder factory = new MetricSqlSessionFactoryBuilder();
factory.setDataSource(dataSource);
factory.setMappers(mappers);

Configuration config = MyBatisConfiguration.defaultConfiguration();
factory.setConfiguration(config);

factory.registerWebTypeAlias();
factory.registerWebTypeHandler();
factory.setTransactionFactory(new ManagedTransactionFactory());
return factory.build();
}


@Bean
public SqlSessionTemplate sqlPinotSessionTemplate(
@Qualifier("sqlPinotSessionFactory") SqlSessionFactory sessionFactory) {
return new SqlSessionTemplate(sessionFactory);
}

@Bean
public PinotAsyncTemplate pinotAsyncTemplate(
@Qualifier("sqlPinotSessionFactory") SqlSessionFactory sessionFactory) {
return new PinotAsyncTemplate(sessionFactory);
}
}

This file was deleted.

0 comments on commit e8367a9

Please sign in to comment.