Line 0
Link Here
|
|
|
1 |
/******************************************************************************* |
2 |
* Copyright (c) 1998, 2008 Oracle. All rights reserved. |
3 |
* This program and the accompanying materials are made available under the |
4 |
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 |
5 |
* which accompanies this distribution. |
6 |
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html |
7 |
* and the Eclipse Distribution License is available at |
8 |
* http://www.eclipse.org/org/documents/edl-v10.php. |
9 |
* |
10 |
* Contributors: |
11 |
* Oracle - initial API and implementation from Oracle TopLink |
12 |
******************************************************************************/ |
13 |
package org.eclipse.persistence.testing.tests.jpa.memory; |
14 |
|
15 |
import java.util.List; |
16 |
import java.util.HashMap; |
17 |
import java.util.Map; |
18 |
|
19 |
import javax.persistence.EntityManager; |
20 |
import javax.persistence.Query; |
21 |
import javax.persistence.spi.PersistenceProvider; |
22 |
|
23 |
import org.eclipse.persistence.testing.models.performance.*; |
24 |
import org.eclipse.persistence.internal.helper.Helper; |
25 |
import org.eclipse.persistence.jpa.JpaEntityManager; |
26 |
import org.eclipse.persistence.jpa.config.CacheUsage; |
27 |
import org.eclipse.persistence.testing.framework.*; |
28 |
|
29 |
/** |
30 |
* Memory tests that test for memory leaks. |
31 |
*/ |
32 |
public class JPAMemoryLeakModel extends TestModel { |
33 |
|
34 |
public JPAMemoryLeakModel() { |
35 |
setDescription("Memory tests that test for memory leaks."); |
36 |
} |
37 |
|
38 |
public void addRequiredSystems() { |
39 |
addRequiredSystem(new EmployeeSystem()); |
40 |
} |
41 |
|
42 |
public void addTests() { |
43 |
addTest(buildReadTest()); |
44 |
addTest(buildInsertTest()); |
45 |
addTest(buildUpdateTest()); |
46 |
} |
47 |
|
48 |
/** |
49 |
* Create/populate database. |
50 |
*/ |
51 |
public void setup() { |
52 |
// Populate database (through TopLink). |
53 |
for (int j = 0; j < 100; j++) { |
54 |
Employee empInsert = new Employee(); |
55 |
empInsert.setFirstName("Brendan"); |
56 |
empInsert.setMale(); |
57 |
empInsert.setLastName("" + j + ""); |
58 |
empInsert.setSalary(100000); |
59 |
EmploymentPeriod employmentPeriod = new EmploymentPeriod(); |
60 |
java.sql.Date startDate = Helper.dateFromString("1901-12-31"); |
61 |
java.sql.Date endDate = Helper.dateFromString("1895-01-01"); |
62 |
employmentPeriod.setEndDate(startDate); |
63 |
employmentPeriod.setStartDate(endDate); |
64 |
empInsert.setPeriod(employmentPeriod); |
65 |
empInsert.setAddress(new Address()); |
66 |
empInsert.getAddress().setCity("Nepean"); |
67 |
empInsert.getAddress().setPostalCode("N5J2N5"); |
68 |
empInsert.getAddress().setProvince("ON"); |
69 |
empInsert.getAddress().setStreet("1111 Mountain Blvd. Floor 13, suite " + j); |
70 |
empInsert.getAddress().setCountry("Canada"); |
71 |
empInsert.addPhoneNumber(new PhoneNumber("Work Fax", "613", "2255943")); |
72 |
empInsert.addPhoneNumber(new PhoneNumber("Home", "613", "2224599")); |
73 |
getDatabaseSession().insertObject(empInsert); |
74 |
} |
75 |
setupProvider(); |
76 |
getSession().logMessage(getExecutor().getEntityManagerFactory().getClass().toString()); |
77 |
System.out.println(getExecutor().getEntityManagerFactory().getClass().toString()); |
78 |
} |
79 |
|
80 |
/** |
81 |
* Setup the JPA provider. |
82 |
*/ |
83 |
public void setupProvider() { |
84 |
// Configure provider to be TopLink. |
85 |
String providerClass = "org.eclipse.persistence.jpa.PersistenceProvider"; |
86 |
PersistenceProvider provider = null; |
87 |
try { |
88 |
provider = (PersistenceProvider)Class.forName(providerClass).newInstance(); |
89 |
} catch (Exception error) { |
90 |
throw new TestProblemException("Failed to create persistence provider.", error); |
91 |
} |
92 |
Map properties = getPersistenceProperties(); |
93 |
getExecutor().setEntityManagerFactory(provider.createEntityManagerFactory("performance", properties)); |
94 |
} |
95 |
|
96 |
/** |
97 |
* Build the persistence properties. |
98 |
*/ |
99 |
public Map getPersistenceProperties() { |
100 |
Map properties = new HashMap(); |
101 |
properties.put("eclipselink.jdbc.driver", getSession().getLogin().getDriverClassName()); |
102 |
properties.put("eclipselink.jdbc.url", getSession().getLogin().getConnectionString()); |
103 |
properties.put("eclipselink.jdbc.user", getSession().getLogin().getUserName()); |
104 |
properties.put("eclipselink.jdbc.password", getSession().getLogin().getPassword()); |
105 |
properties.put("eclipselink.logging.level", getSession().getSessionLog().getLevelString()); |
106 |
properties.put("eclipselink.jdbc.cache-statements", "true"); |
107 |
return properties; |
108 |
} |
109 |
|
110 |
/** |
111 |
* Test that inserts allow the garbage collection of the persisted objects. |
112 |
*/ |
113 |
public TestCase buildInsertTest() { |
114 |
MemoryLeakTestCase test = new MemoryLeakTestCase() { |
115 |
public void test() { |
116 |
EntityManager manager = createEntityManager(); |
117 |
((JpaEntityManager)manager).getUnitOfWork().getParent().getIdentityMapAccessor().initializeAllIdentityMaps(); |
118 |
manager.getTransaction().begin(); |
119 |
for (int count = 0; count < 500; count++) { |
120 |
Employee employee = new Employee(); |
121 |
employee.setFirstName("NewGuy"); |
122 |
employee.setLastName("Smith"); |
123 |
|
124 |
manager.persist(employee); |
125 |
addWeakReference(employee); |
126 |
} |
127 |
manager.getTransaction().commit(); |
128 |
Query query = manager.createQuery("Select e from Employee e"); |
129 |
query.setHint("eclipselink.return-shared", true); |
130 |
query.setHint("eclipselink.cache-usage", CacheUsage.CheckCacheOnly); |
131 |
addWeakReferences(query.getResultList()); |
132 |
addWeakReference(manager); |
133 |
addWeakReference(((JpaEntityManager)manager).getUnitOfWork()); |
134 |
addWeakReference(((JpaEntityManager)manager).getSession()); |
135 |
manager.close(); |
136 |
} |
137 |
|
138 |
public void reset() { |
139 |
getSession().executeNonSelectingSQL("Delete from PHONE where P_NUMBER = '9991111'"); |
140 |
getSession().executeNonSelectingSQL("Delete from EMPLOYEE where F_NAME = 'NewGuy'"); |
141 |
getSession().executeNonSelectingSQL("Delete from ADDRESS where STREET = 'Hasting Perf'"); |
142 |
} |
143 |
}; |
144 |
test.setName("InsertMemoryLeakTest"); |
145 |
test.setThreshold(100); |
146 |
return test; |
147 |
} |
148 |
|
149 |
/** |
150 |
* Test that update allow the garbage collection of the objects. |
151 |
*/ |
152 |
public TestCase buildUpdateTest() { |
153 |
MemoryLeakTestCase test = new MemoryLeakTestCase() { |
154 |
public void test() { |
155 |
EntityManager manager = createEntityManager(); |
156 |
((JpaEntityManager)manager).getUnitOfWork().getParent().getIdentityMapAccessor().initializeAllIdentityMaps(); |
157 |
manager.getTransaction().begin(); |
158 |
Query query = manager.createQuery("Select e from Employee e"); |
159 |
List<Employee> employees = query.getResultList(); |
160 |
for (Employee employee : employees) { |
161 |
employee.setFirstName("UpdatedGuy"); |
162 |
|
163 |
addWeakReference(employee); |
164 |
} |
165 |
manager.getTransaction().commit(); |
166 |
query = manager.createQuery("Select e from Employee e"); |
167 |
query.setHint("eclipselink.return-shared", true); |
168 |
addWeakReferences(query.getResultList()); |
169 |
addWeakReference(manager); |
170 |
addWeakReference(((JpaEntityManager)manager).getUnitOfWork()); |
171 |
addWeakReference(((JpaEntityManager)manager).getUnitOfWork().getParent()); |
172 |
manager.close(); |
173 |
} |
174 |
}; |
175 |
test.setName("UpdateMemoryLeakTest"); |
176 |
test.setThreshold(100); |
177 |
return test; |
178 |
} |
179 |
|
180 |
/** |
181 |
* Test that read allow the garbage collection of the objects. |
182 |
*/ |
183 |
public TestCase buildReadTest() { |
184 |
MemoryLeakTestCase test = new MemoryLeakTestCase() { |
185 |
public void test() { |
186 |
EntityManager manager = createEntityManager(); |
187 |
((JpaEntityManager)manager).getUnitOfWork().getParent().getIdentityMapAccessor().initializeAllIdentityMaps(); |
188 |
Query query = manager.createQuery("Select e from Employee e"); |
189 |
query.setHint("eclipselink.return-shared", true); |
190 |
addWeakReferences(query.getResultList()); |
191 |
addWeakReference(query); |
192 |
query = manager.createQuery("Select e from Employee e"); |
193 |
addWeakReferences(query.getResultList()); |
194 |
addWeakReference(query); |
195 |
addWeakReference(manager); |
196 |
addWeakReference(((JpaEntityManager)manager).getUnitOfWork()); |
197 |
addWeakReference(((JpaEntityManager)manager).getSession()); |
198 |
manager.close(); |
199 |
} |
200 |
}; |
201 |
test.setName("ReadMemoryLeakTest"); |
202 |
test.setThreshold(100); |
203 |
return test; |
204 |
} |
205 |
} |