|
38 | 38 | @SuppressWarnings("ALL")
|
39 | 39 | class CursorOomTest {
|
40 | 40 |
|
41 |
| - private static SqlSessionFactory sqlSessionFactory; |
| 41 | + private static SqlSessionFactory sqlSessionFactory; |
42 | 42 |
|
43 |
| - @BeforeAll |
44 |
| - static void setUp() throws Exception { |
45 |
| - // create an SqlSessionFactory |
46 |
| - try (Reader reader = Resources.getResourceAsReader( |
47 |
| - "org/apache/ibatis/submitted/cursor_cache_oom/mybatis-config.xml")) { |
48 |
| - sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); |
49 |
| - } |
50 |
| - |
51 |
| - // populate in-memory database |
52 |
| - BaseDataTest.runScript( |
53 |
| - sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), |
54 |
| - "org/apache/ibatis/submitted/cursor_cache_oom/CreateDB.sql" |
55 |
| - ); |
| 43 | + @BeforeAll |
| 44 | + static void setUp() throws Exception { |
| 45 | + // create an SqlSessionFactory |
| 46 | + try (Reader reader = Resources |
| 47 | + .getResourceAsReader("org/apache/ibatis/submitted/cursor_cache_oom/mybatis-config.xml")) { |
| 48 | + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); |
56 | 49 | }
|
57 | 50 |
|
58 |
| - private static Map<CacheKey, Object> getNestedResultObjects(Cursor<User> users) throws IllegalAccessException, |
59 |
| - NoSuchFieldException { |
60 |
| - DefaultCursor<User> defaultCursor = (DefaultCursor<User>) users; |
61 |
| - Field resultSetHandlerField = DefaultCursor.class.getDeclaredField("resultSetHandler"); |
62 |
| - resultSetHandlerField.setAccessible(true); |
63 |
| - DefaultResultSetHandler defaultResultSetHandler = |
64 |
| - (DefaultResultSetHandler) resultSetHandlerField |
65 |
| - .get(defaultCursor); |
66 |
| - Field nestedResultObjectsField = DefaultResultSetHandler.class.getDeclaredField("nestedResultObjects"); |
67 |
| - nestedResultObjectsField.setAccessible(true); |
68 |
| - return (Map<CacheKey, Object>) nestedResultObjectsField |
69 |
| - .get(defaultResultSetHandler); |
70 |
| - } |
| 51 | + // populate in-memory database |
| 52 | + BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), |
| 53 | + "org/apache/ibatis/submitted/cursor_cache_oom/CreateDB.sql"); |
| 54 | + } |
71 | 55 |
|
72 |
| - private static List<Cursor<?>> getCursors(SqlSession sqlSession) |
73 |
| - throws NoSuchFieldException, IllegalAccessException { |
74 |
| - DefaultSqlSession session = (DefaultSqlSession) sqlSession; |
75 |
| - Field cursorListField = DefaultSqlSession.class.getDeclaredField("cursorList"); |
76 |
| - cursorListField.setAccessible(true); |
77 |
| - List<Cursor<?>> cursorList = |
78 |
| - (List<Cursor<?>>) cursorListField.get(session); |
79 |
| - return cursorList; |
80 |
| - } |
| 56 | + private static Map<CacheKey, Object> getNestedResultObjects(Cursor<User> users) |
| 57 | + throws IllegalAccessException, NoSuchFieldException { |
| 58 | + DefaultCursor<User> defaultCursor = (DefaultCursor<User>) users; |
| 59 | + Field resultSetHandlerField = DefaultCursor.class.getDeclaredField("resultSetHandler"); |
| 60 | + resultSetHandlerField.setAccessible(true); |
| 61 | + DefaultResultSetHandler defaultResultSetHandler = (DefaultResultSetHandler) resultSetHandlerField |
| 62 | + .get(defaultCursor); |
| 63 | + Field nestedResultObjectsField = DefaultResultSetHandler.class.getDeclaredField("nestedResultObjects"); |
| 64 | + nestedResultObjectsField.setAccessible(true); |
| 65 | + return (Map<CacheKey, Object>) nestedResultObjectsField.get(defaultResultSetHandler); |
| 66 | + } |
81 | 67 |
|
82 |
| - @Test |
83 |
| - void shouldNotCacheAllDataForWholeSessionWhileUsingCursor() throws IOException, NoSuchFieldException, |
84 |
| - IllegalAccessException { |
85 |
| - try (SqlSession sqlSession = sqlSessionFactory.openSession()) { |
86 |
| - Mapper mapper = sqlSession.getMapper(Mapper.class); |
87 |
| - try (Cursor<User> users = mapper.fetchUsers()) { |
88 |
| - for (User user : users) { |
89 |
| - consumeUser(user); |
90 |
| - } |
91 |
| - Map nestedResultObjects = getNestedResultObjects(users); |
| 68 | + private static List<Cursor<?>> getCursors(SqlSession sqlSession) throws NoSuchFieldException, IllegalAccessException { |
| 69 | + DefaultSqlSession session = (DefaultSqlSession) sqlSession; |
| 70 | + Field cursorListField = DefaultSqlSession.class.getDeclaredField("cursorList"); |
| 71 | + cursorListField.setAccessible(true); |
| 72 | + List<Cursor<?>> cursorList = (List<Cursor<?>>) cursorListField.get(session); |
| 73 | + return cursorList; |
| 74 | + } |
92 | 75 |
|
93 |
| - Assertions.assertFalse(nestedResultObjects.isEmpty()); |
| 76 | + @Test |
| 77 | + void shouldNotCacheAllDataForWholeSessionWhileUsingCursor() |
| 78 | + throws IOException, NoSuchFieldException, IllegalAccessException { |
| 79 | + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { |
| 80 | + Mapper mapper = sqlSession.getMapper(Mapper.class); |
| 81 | + try (Cursor<User> users = mapper.fetchUsers()) { |
| 82 | + for (User user : users) { |
| 83 | + consumeUser(user); |
| 84 | + } |
| 85 | + Map nestedResultObjects = getNestedResultObjects(users); |
94 | 86 |
|
95 |
| - // does not pass now |
96 |
| - // will be great, if cursor will use constant memory instead of linear one |
97 |
| -// Assertions.assertTrue(nestedResultObjects.size() <= 2); |
98 |
| - } |
| 87 | + Assertions.assertFalse(nestedResultObjects.isEmpty()); |
99 | 88 |
|
100 |
| - List<Cursor<?>> cursorList = getCursors(sqlSession); |
| 89 | + // does not pass now |
| 90 | + // will be great, if cursor will use constant memory instead of linear one |
| 91 | + // Assertions.assertTrue(nestedResultObjects.size() <= 2); |
| 92 | + } |
101 | 93 |
|
102 |
| - // expect that either reference to the cursor itselfis gone or cursor does not contains all the fetched data |
103 |
| - // the most preferrable way will be not to cache data, when the row is already processed (see commented |
104 |
| - // line above) |
105 |
| - Assertions.assertTrue( |
106 |
| - cursorList.isEmpty() || getNestedResultObjects((Cursor<User>) cursorList.get(0)).size() <= 2 |
107 |
| - ); |
108 |
| - } |
109 |
| - } |
| 94 | + List<Cursor<?>> cursorList = getCursors(sqlSession); |
110 | 95 |
|
111 |
| - private void consumeUser(User user) { |
112 |
| - // do nothing |
| 96 | + // expect that either reference to the cursor itselfis gone or cursor does not contains all the fetched data |
| 97 | + // the most preferrable way will be not to cache data, when the row is already processed (see commented |
| 98 | + // line above) |
| 99 | + Assertions |
| 100 | + .assertTrue(cursorList.isEmpty() || getNestedResultObjects((Cursor<User>) cursorList.get(0)).size() <= 2); |
113 | 101 | }
|
| 102 | + } |
| 103 | + |
| 104 | + private void consumeUser(User user) { |
| 105 | + // do nothing |
| 106 | + } |
114 | 107 | }
|
0 commit comments