1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.monitoring.jdbc;
18
19 import org.apache.commons.monitoring.Role;
20 import org.apache.commons.monitoring.counters.Counter;
21 import org.apache.commons.monitoring.repositories.Repository;
22 import org.apache.commons.monitoring.stopwatches.StopWatch;
23
24 import java.lang.reflect.InvocationTargetException;
25 import java.lang.reflect.Method;
26 import java.sql.PreparedStatement;
27
28
29
30
31 public class MonitoredPreparedStatement extends MonitoredStatement {
32 private final PreparedStatement statement;
33 private final String sql;
34
35 public MonitoredPreparedStatement(final PreparedStatement statement, final String sql) {
36 super(statement);
37 this.statement = statement;
38 this.sql = sql;
39 }
40
41 @Override
42 public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
43 final String name = method.getName();
44 if ((args == null || args.length == 0) && name.startsWith("execute")) {
45 final StopWatch stopWatch = Repository.INSTANCE.start(Repository.INSTANCE.getCounter(new Counter.Key(Role.JDBC, sql)));
46 try {
47 return method.invoke(statement, args);
48 } catch (final InvocationTargetException e) {
49 throw extractSQLException(e);
50 } finally {
51 stopWatch.stop();
52 }
53 }
54 return super.invoke(proxy, method, args);
55 }
56
57 }