From 3108076953e1267e9fbdfcbc6db16f3bb21e63f0 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Tue, 8 Jan 2019 10:15:31 +0100 Subject: [PATCH] SqlServer queryplan captured in transaction & fix of possible NPE (#1592) * SqlServer queryplan captured in transaction & fix of possible NPE * rolled back transaction earlier --- .../server/query/CQueryBindCapture.java | 6 ++++-- .../server/query/QueryPlanLoggerSqlServer.java | 15 +++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java b/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java index b856ed535..644f236fe 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryBindCapture.java @@ -59,8 +59,10 @@ class CQueryBindCapture { final BindCapture last = this.bindCapture; DQueryPlanOutput queryPlan = planLogger.logQueryPlan(request.getConnection(), cQueryPlan, last); - queryPlan.with(queryTimeMicros, captureCount, cQueryPlan.getPlanKey().toString()); - request.process(queryPlan); + if (queryPlan != null) { + queryPlan.with(queryTimeMicros, captureCount, cQueryPlan.getPlanKey().toString()); + request.process(queryPlan); + } } } diff --git a/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerSqlServer.java b/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerSqlServer.java index 9a6b82459..ad45332cc 100644 --- a/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerSqlServer.java +++ b/src/main/java/io/ebeaninternal/server/query/QueryPlanLoggerSqlServer.java @@ -20,28 +20,31 @@ public class QueryPlanLoggerSqlServer extends QueryPlanLogger { public DQueryPlanOutput logQueryPlan(Connection conn, CQueryPlan plan, BindCapture bind) { try (Statement stmt = conn.createStatement()) { - stmt.execute("SET STATISTICS XML ON"); + stmt.execute("set statistics xml on"); + stmt.execute("begin transaction"); try (PreparedStatement explainStmt = conn.prepareStatement(plan.getSql())) { bind.prepare(explainStmt, conn); try (ResultSet rset = explainStmt.executeQuery()) { - // unfortunately, this will execute the + // unfortunately, this will execute the query, so we execute this in a transaction } + stmt.execute("rollback transaction"); + String xml = null; if (explainStmt.getMoreResults()) { try (ResultSet rset = explainStmt.getResultSet()) { StringBuilder sb = new StringBuilder(); - while (rset.next()) { - sb.append("XML: ").append(rset.getString(1)); + if (rset.next()) { + xml = rset.getString(1); } - return createPlan(plan, bind.toString(), sb.toString()); } } + return createPlan(plan, bind.toString(), xml); } catch (SQLException e) { queryPlanLog.error("Could not log query plan", e); } finally { - stmt.execute("SET STATISTICS XML OFF"); + stmt.execute("set statistics xml off"); } } catch (SQLException e) { queryPlanLog.error("Could not log query plan", e);