Ik moet voor een applicatie een grote hoeveelheid gegevens uit de database lezen en deze gaan opslaan in een Hashmap. Dit neemt echt behoorlijk veel tijd in beslag en ik moet dit dus gaan optimaliseren. Als ik echter met een profiler ga kijken waar ik zou gaan moeten optimaliseren zie ik de volgende resultaten (kan hier nu niet oploaden, vandaar dat het geen plaatje is)
- 34.4% - 19763 ms - 70129 inv. java.sql.ResultSet.next
- 20.2% - 11644 ms - 140256 inv. java.sql.ResultSet.getInt
- 15.8% - 9093 ms - 1 inv. java.sql.PreparedStatement.executeQuery
- 11.0% - 6307 ms - 70128 inv. java.sql.ResultSet.getDouble
- 10.1% - 5784 ms - 70128 inv. java.sql.ResultSet.getDate
- 4.7% - 2720 ms - 1 inv. com.xxxxx.dataaccess.ConnectionPool.getConnection
De code is als volgt:
Ik heb al geprobeerd om de HashMap een grote initiele waarde mee te geven, maar dat had geen merkbaar effect. Ik heb de fetch size van de ResultSet vergroot, en dat levert ongeveer een halve minuut op, maar dan duurt het alsnog 4,5 minuut. En aangezien dit voor twee tabellen gebeurd, is dat gewoon te lang. Het gaat hier trouwens om tabellen met ongeveer 70.000 records..
Heeft iemand nog andere suggesties?
- 34.4% - 19763 ms - 70129 inv. java.sql.ResultSet.next
- 20.2% - 11644 ms - 140256 inv. java.sql.ResultSet.getInt
- 15.8% - 9093 ms - 1 inv. java.sql.PreparedStatement.executeQuery
- 11.0% - 6307 ms - 70128 inv. java.sql.ResultSet.getDouble
- 10.1% - 5784 ms - 70128 inv. java.sql.ResultSet.getDate
- 4.7% - 2720 ms - 1 inv. com.xxxxx.dataaccess.ConnectionPool.getConnection
De code is als volgt:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| HashMap prices = new HashMap(); Connection con = ConnectionPool.getConnection(); query = "SELECT day, hour, sourceID, price FROM HourlyPrices" +"ORDER BY sourceID, day, hour"; preparedStatement = con.prepareStatement(query); resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { Date day = new Date(resultSet.getDate(1).getTime()); int hour = resultSet.getInt(2); int sourceID = resultSet.getInt(3); double price = resultSet.getDouble(4); DayTimeKey key = new DayTimeKey(day, hour, sourceID); prices.put(key, new Double(price)); } |
Ik heb al geprobeerd om de HashMap een grote initiele waarde mee te geven, maar dat had geen merkbaar effect. Ik heb de fetch size van de ResultSet vergroot, en dat levert ongeveer een halve minuut op, maar dan duurt het alsnog 4,5 minuut. En aangezien dit voor twee tabellen gebeurd, is dat gewoon te lang. Het gaat hier trouwens om tabellen met ongeveer 70.000 records..
Heeft iemand nog andere suggesties?