|
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