Беспорядок кэша оракула с результатами запроса mybatis (не может получить последнее)

Моя среда это:
Spring Boot + Mybatis + Oracle 10g + Jdk1.8

Я получил таблицу с именем book в oracle вот так:

+---------+------+--------+
| book_id | name | number |
+---------+------+--------+
|       1 | b1   |    123 |
|       2 | b2   |    123 |
|       3 | b3   |   2343 |
+---------+------+--------+
3 rows in set (0.00 sec)

Я заставил его работать и успешно отобразил его с помощью созданного мэппером. Но после того, как я вставил еще 2 записи в эту таблицу с помощью plsql, я все равно получил те же 3 записи вместо всех 5(как показано ниже), когда я запрашивал его с помощью mybatis mapper,

+---------+------+--------+  
| book_id | name | number |  
+---------+------+--------+  
|       1 | b1   |    123 |  
|       2 | b2   |    123 |  
|       3 | b3   |   2343 |  
|       4 | b4   |  22343 |  
|       5 | b5   |     43 |  
+---------+------+--------+  
5 rows in set (0.00 sec) 

Затем я изменяю стратегию кэширования в oracle, как это.

alter table book nocache

Это снова сработало! Все 5 записей успешно отображаются с помощью mybatis mapper. Но почему? Должен ли я каждый раз очищать кеш оракула? Это не правильно. Есть лучшее решение? Любой ответ будет полезен. Спасибо

application.properties

# Spring
spring.resources.static-locations=classpath:/static/

# MyBatis
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.local-cache-scope=statement
# DataSource 1
spring.datasource.db1.url=jdbc:oracle:thin:@*******
spring.datasource.db1.username=***
spring.datasource.db1.password=***
spring.datasource.db1.driver-class-bookName=oracle.jdbc.OracleDriver

картопостроитель

@Mapper
@Qualifier("bookMapper")
public interface BookMapper {
    @Select({"select * from book"})
    @Options(useCache = false)
    @Results({
            @Result(property = "bookId",column = "book_id"),
            @Result(property = "bookName",column = "book_name"),
            @Result(property = "bookNumber",column = "book_number")
    })
    List<BookEntity>  getALL();
//    insertBook();
}

юридическое лицо

public class BookEntity {
    long bookId;
    String bookName;
    int bookNumber;

    //getters and setters


}

1 ответ

Решение

Проблема не связана с очисткой кэша.

Я думаю, что нет никаких проблем, кроме выдачи commit после вашего insert( a DML ) заявление.

Если вы не выпустили commit Вы можете получить только 3 записи из другого сеанса.

Но после того, как вы выпустите,

изменить настольную книгу nocache ( a DDL )

, происходит неявная фиксация, и вы можете увидеть все 5 записей.

Другие вопросы по тегам