Производительность MyBatis - картографы доступа

1

Я использую MyBatis в проекте, который извлекает много строк (более 2M строк).

У меня есть простой вопрос о том, как работает MyBatis. Каждый раз, когда мне нужно действие от картографа, MyBatis читает XML файл и извлекает запрос? Или отображаются в памяти картотеки, а MyBatis напрямую обращаются к ним?

Это важно, поскольку доступ и чтение XML файла могут повлиять на ожидаемые значения производительности.

Заранее спасибо. С уважением

Теги:
mybatis

2 ответа

2
Лучший ответ

Вскоре MyBatis анализирует XML файл, когда вы сначала SqlSessionFactory из файла конфигурации конфигурации. После этого все свойства, карты и настройки сохраняются в памяти.

Объяснение: Как указано в документе, вы можете настроить свой SqlSessionFactory без XML прямо на Java следующим образом (см. Последнюю строку):

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

Фактически, когда вы SqlSessionFactory свой SqlSessionFactory из XML, вы будете писать что-то вроде этого:

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

Если вы отслеживаете источник в SqlSessionFactoryBuilder,

  public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      return build(parser.parse());
 ...

Метод parse() возвращает объект Configuration, который содержит всю информацию, предоставленную вами в XML файле.

public class Configuration {

  protected Environment environment;

  protected boolean safeRowBoundsEnabled = false;
  protected boolean safeResultHandlerEnabled = true;
  protected boolean mapUnderscoreToCamelCase = false;
  protected boolean aggressiveLazyLoading = true;
  protected boolean multipleResultSetsEnabled = true;
  protected boolean useGeneratedKeys = false;
  protected boolean useColumnLabel = true;
  protected boolean cacheEnabled = true;
  protected boolean callSettersOnNulls = false;
  protected String logPrefix;
  protected Class <? extends Log> logImpl;
  protected LocalCacheScope localCacheScope = LocalCacheScope.SESSION;
  protected JdbcType jdbcTypeForNull = JdbcType.OTHER;
  protected Set<String> lazyLoadTriggerMethods = new HashSet<String>(Arrays.asList(new String[] { "equals", "clone", "hashCode", "toString" }));
  protected Integer defaultStatementTimeout;
  protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
  protected AutoMappingBehavior autoMappingBehavior = AutoMappingBehavior.PARTIAL;

  protected Properties variables = new Properties();
  protected ObjectFactory objectFactory = new DefaultObjectFactory();
  protected ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory();
  protected MapperRegistry mapperRegistry = new MapperRegistry(this);

  protected boolean lazyLoadingEnabled = false;
  protected ProxyFactory proxyFactory;

  protected String databaseId;
  /**
   * Configuration factory class.
   * Used to create Configuration for loading deserialized unread properties.
   *
   * @see <a href='https://code.google.com/p/mybatis/issues/detail?id=300'>Issue 300</a> (google code)
   */
  protected Class<?> configurationFactory;

  protected final InterceptorChain interceptorChain = new InterceptorChain();
  protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
  protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
  protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry();

  protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
  protected final Map<String, Cache> caches = new StrictMap<Cache>("Caches collection");
  protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>("Result Maps collection");
  protected final Map<String, ParameterMap> parameterMaps = new StrictMap<ParameterMap>("Parameter Maps collection");
  protected final Map<String, KeyGenerator> keyGenerators = new StrictMap<KeyGenerator>("Key Generators collection");

  protected final Set<String> loadedResources = new HashSet<String>();
  protected final Map<String, XNode> sqlFragments = new StrictMap<XNode>("XML fragments parsed from previous mappers");

  protected final Collection<XMLStatementBuilder> incompleteStatements = new LinkedList<XMLStatementBuilder>();
  protected final Collection<CacheRefResolver> incompleteCacheRefs = new LinkedList<CacheRefResolver>();
  protected final Collection<ResultMapResolver> incompleteResultMaps = new LinkedList<ResultMapResolver>();
  protected final Collection<MethodResolver> incompleteMethods = new LinkedList<MethodResolver>();
...
  • 0
    Большое спасибо за объяснение. Именно то, что мне нужно
0

Просто не беспокойтесь об этом. После настройки MyBatis разобрал mapper xml с локальной переменной (сначала прочитал xml файл). org.apache.ibatis.session.Configuration.mappedStatements.

Теперь вы вызываете mapper.add()/sqlSession.selectOne() или другие, он сначала получит этот параметр /resultMap/resultType из mappedStatements, не будет читать xml снова.

Кроме того, MyBatis кэшировал метод прокси-сервера mapper. (создайте экземпляр метода proxy при первом вызове)

final String resource = "org/apache/ibatis/builder/MapperConfig.xml";
final Reader reader = Resources.getResourceAsReader(resource);
manager = SqlSessionManager.newInstance(reader);
AuthorMapper mapper = manager.getMapper(AuthorMapper.class);
Author expected = new Author(500, "cbegin", "******", "[email protected]", "Something...", null);
mapper.insertAuthor(expected);

(как получить картограф)

public class MapperRegistry {
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
    if (mapperProxyFactory == null) {
        throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
    }
    try {
        return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
        throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
}
}

И, вы можете использовать кеш запросов в mybatis 3. x+. Следуя этому

<configuration>
  <settings>
    <setting name="cacheEnabled" value="true" />
  <settings>
</configuration>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню