Skip to content

Commit ba149a1

Browse files
marschallbeikov
authored andcommitted
HHH-18111 Call EventManager for stored procedures
1 parent 07bfe6a commit ba149a1

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
2020
import org.hibernate.engine.jdbc.spi.SqlStatementLogger;
2121
import org.hibernate.engine.spi.SessionFactoryImplementor;
22+
import org.hibernate.event.spi.EventManager;
23+
import org.hibernate.event.spi.HibernateMonitoringEvent;
2224
import org.hibernate.internal.CoreLogging;
2325
import org.hibernate.procedure.internal.ProcedureCallImpl;
2426
import org.hibernate.procedure.internal.ScalarDomainResultBuilder;
@@ -74,6 +76,8 @@ protected void executeStatement() {
7476
if ( sqlStatementLogger.getLogSlowQuery() > 0 ) {
7577
executeStartNanos = System.nanoTime();
7678
}
79+
final EventManager eventManager = context.getSession().getEventManager();
80+
final HibernateMonitoringEvent jdbcPreparedStatementExecutionEvent = eventManager.beginJdbcPreparedStatementExecutionEvent();
7781
try {
7882
final boolean isResultSet = jdbcStatement.execute();
7983
currentReturnState = buildCurrentReturnState( isResultSet );
@@ -82,6 +86,7 @@ protected void executeStatement() {
8286
throw convert( e, "Error calling CallableStatement.getMoreResults" );
8387
}
8488
finally {
89+
eventManager.completeJdbcPreparedStatementExecutionEvent( jdbcPreparedStatementExecutionEvent, sql );
8590
sqlStatementLogger.logSlowQuery( sql, executeStartNanos, this.context.getSession().getJdbcSessionContext() );
8691
}
8792
}

hibernate-jfr/src/test/java/org/hibernate/event/jfr/JdbcPreparedStatementEventTests.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33
import java.util.List;
44
import java.util.Locale;
55

6+
import org.hibernate.dialect.H2Dialect;
67
import org.hibernate.event.jfr.internal.JdbcPreparedStatementCreationEvent;
78
import org.hibernate.event.jfr.internal.JdbcPreparedStatementExecutionEvent;
8-
9+
import org.hibernate.procedure.ProcedureCall;
910
import org.hibernate.testing.orm.junit.DomainModel;
11+
import org.hibernate.testing.orm.junit.RequiresDialect;
1012
import org.hibernate.testing.orm.junit.SessionFactory;
1113
import org.hibernate.testing.orm.junit.SessionFactoryScope;
1214
import org.junit.jupiter.api.Test;
1315

1416
import jakarta.persistence.Entity;
1517
import jakarta.persistence.Id;
18+
import jakarta.persistence.ParameterMode;
1619
import jdk.jfr.consumer.RecordedEvent;
1720
import org.moditect.jfrunit.EnableEvent;
1821
import org.moditect.jfrunit.JfrEventTest;
@@ -85,6 +88,53 @@ public void testJdbcPreparedStatementEventNoFired(SessionFactoryScope scope) {
8588
assertThat( events ).hasSize( 0 );
8689
}
8790

91+
@Test
92+
@RequiresDialect(H2Dialect.class)
93+
@EnableEvent(JdbcPreparedStatementCreationEvent.NAME)
94+
@EnableEvent(JdbcPreparedStatementExecutionEvent.NAME)
95+
public void testJdbcPreparedStatementEventStoredProcedure(SessionFactoryScope scope) {
96+
scope.inTransaction(
97+
session -> {
98+
ProcedureCall call = session.createStoredProcedureCall("DB_OBJECT_SQL", String.class)
99+
.registerStoredProcedureParameter(1, String.class, ParameterMode.IN)
100+
.registerStoredProcedureParameter(2, String.class, ParameterMode.IN)
101+
.setParameter(1, "USER")
102+
.setParameter(2, "SA");
103+
boolean hasResult = call.execute();
104+
assertThat( hasResult ).isTrue();
105+
Object createSa = call.getSingleResult();
106+
assertThat( createSa ).isInstanceOf( String.class );
107+
assertThat( ((String) createSa).toLowerCase( Locale.ROOT ) ).contains( "create user if not exists " );
108+
109+
final List<RecordedEvent> events = jfrEvents.events()
110+
.filter(
111+
recordedEvent ->
112+
{
113+
String eventName = recordedEvent.getEventType().getName();
114+
return eventName.equals( JdbcPreparedStatementCreationEvent.NAME )
115+
|| eventName.equals( JdbcPreparedStatementExecutionEvent.NAME );
116+
}
117+
).toList();
118+
assertThat( events ).hasSize( 2 );
119+
120+
RecordedEvent preparedStatementCreationEvent = events.get( 0 );
121+
assertThat( preparedStatementCreationEvent.getEventType().getName() )
122+
.isEqualTo( JdbcPreparedStatementCreationEvent.NAME );
123+
assertThat( preparedStatementCreationEvent.getLong( "executionTime" ) ).isGreaterThan( 0 );
124+
assertThat( preparedStatementCreationEvent.getString( "sql" ).toLowerCase( Locale.ROOT ) )
125+
.contains( "{call " );
126+
127+
RecordedEvent preparedStatementExecutionEvent = events.get( 1 );
128+
assertThat( preparedStatementExecutionEvent.getEventType().getName() )
129+
.isEqualTo( JdbcPreparedStatementExecutionEvent.NAME );
130+
assertThat( preparedStatementExecutionEvent.getLong( "executionTime" ) ).isGreaterThan( 0 );
131+
assertThat( preparedStatementExecutionEvent.getString( "sql" ) )
132+
.isEqualTo( preparedStatementCreationEvent.getString( "sql" ) );
133+
}
134+
);
135+
136+
}
137+
88138
@Entity(name = "TestEntity")
89139
public static class TestEntity {
90140
@Id

0 commit comments

Comments
 (0)