1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.plugins.jpa.modules.hibernate.service;
35
36 import fr.paris.lutece.portal.service.jpa.EntityManagerService;
37 import fr.paris.lutece.portal.service.util.AppPropertiesService;
38 import fr.paris.lutece.util.jpa.JPAConstants;
39
40 import org.apache.log4j.Logger;
41
42 import org.hibernate.SessionFactory;
43
44 import org.hibernate.ejb.HibernateEntityManagerFactory;
45
46 import org.hibernate.jmx.StatisticsService;
47
48 import org.hibernate.stat.Statistics;
49
50 import java.lang.management.ManagementFactory;
51
52 import java.util.ArrayList;
53 import java.util.List;
54 import java.util.Map;
55 import java.util.Map.Entry;
56
57 import javax.management.MBeanServer;
58 import javax.management.ObjectName;
59
60 import javax.persistence.EntityManagerFactory;
61
62
63
64
65
66
67 public class HibernateMonitorService
68 {
69 private static final Logger logger = Logger.getLogger( JPAConstants.JPA_LOGGER );
70 private EntityManagerService _service;
71 private boolean _bJMXEnabled;
72 private boolean _bStatisticsEnabled;
73
74
75
76
77
78 public List<HibernateStatistics> computeStatistics( )
79 {
80 List<HibernateStatistics> listStats = new ArrayList<HibernateStatistics>( );
81
82 for ( Entry<String, EntityManagerFactory> entry : _service.getEntityManagerFactories( ).entrySet( ) )
83 {
84 Statistics stats = getEntityManagerFactoryImpl( entry.getValue( ) ).getSessionFactory( ).getStatistics( );
85
86 HibernateStatistics hibernateStatistics = new HibernateStatistics( );
87 hibernateStatistics.setPoolName( entry.getKey( ) );
88 hibernateStatistics.setStats( stats );
89
90 listStats.add( hibernateStatistics );
91 }
92
93 return listStats;
94 }
95
96
97
98
99
100 public void setJMXEnabled( boolean bJMXEnabled )
101 {
102 _bJMXEnabled = bJMXEnabled;
103 }
104
105
106
107
108
109 public boolean isJMXEnabled( )
110 {
111 return _bJMXEnabled;
112 }
113
114
115
116
117
118 public void setStatisticsEnabled( boolean bStatisticsEnabled )
119 {
120 _bStatisticsEnabled = bStatisticsEnabled;
121 }
122
123
124
125
126
127 public boolean isStatisticsEnabled( )
128 {
129 return _bStatisticsEnabled;
130 }
131
132
133
134
135
136 public void setEntityManagerService( EntityManagerService service )
137 {
138 _service = service;
139 }
140
141
142
143
144
145 public EntityManagerService getEntityManagerService( )
146 {
147 return _service;
148 }
149
150
151
152
153 public void init( )
154 {
155
156 if ( isStatisticsEnabled( ) )
157 {
158 if ( _service.getEntityManagerFactories( ) != null )
159 {
160 doEnableStatistics( );
161 }
162 else
163 {
164 logger.error(
165 "EntityManagerService is not started yet, can't enable hibernate statistics. Manual activation needed." );
166 setStatisticsEnabled( false );
167 }
168 }
169
170
171 if ( isJMXEnabled( ) )
172 {
173 if ( _service.getEntityManagerFactories( ) != null )
174 {
175 setJMXEnabled( registerMBeans( _service.getEntityManagerFactories( ) ) );
176
177 setStatisticsEnabled( true );
178 }
179 else
180 {
181 logger.error(
182 "EntityManagerService is not started yet, can't start hibernate JMX beans. Manual activation needed." );
183 setJMXEnabled( false );
184 }
185 }
186 }
187
188
189
190
191
192 public boolean doActivateJMXBeans( )
193 {
194 if ( _service.getEntityManagerFactories( ) != null )
195 {
196 setJMXEnabled( registerMBeans( _service.getEntityManagerFactories( ) ) );
197 }
198
199 return isJMXEnabled( );
200 }
201
202
203
204
205
206 public void doClearStatistics( String strPoolName )
207 {
208 EntityManagerFactory emf = _service.getEntityManagerFactory( strPoolName );
209
210 if ( emf != null )
211 {
212 HibernateEntityManagerFactory emfImpl = getEntityManagerFactoryImpl( emf );
213 emfImpl.getSessionFactory( ).getStatistics( ).clear( );
214 }
215 }
216
217
218
219
220
221 public void doEnableStatistics( )
222 {
223 setHibernateStatisticsEnabled( true );
224 }
225
226
227
228
229
230 public void doDisableStatistics( )
231 {
232 setHibernateStatisticsEnabled( false );
233 }
234
235
236
237
238
239 private void setHibernateStatisticsEnabled( boolean bEnabled )
240 {
241 for ( EntityManagerFactory emf : _service.getEntityManagerFactories( ).values( ) )
242 {
243 HibernateEntityManagerFactory emfImpl = getEntityManagerFactoryImpl( emf );
244 emfImpl.getSessionFactory( ).getStatistics( ).setStatisticsEnabled( bEnabled );
245
246 if ( !bEnabled )
247 {
248 emfImpl.getSessionFactory( ).getStatistics( ).clear( );
249 }
250 }
251
252 setStatisticsEnabled( bEnabled );
253 }
254
255
256
257
258
259
260 private HibernateEntityManagerFactory getEntityManagerFactoryImpl( EntityManagerFactory emf )
261 {
262 return (HibernateEntityManagerFactory) emf;
263 }
264
265
266
267
268
269
270 private boolean registerMBeans( Map<String, EntityManagerFactory> mapFactories )
271 {
272 logger.debug( "Initializing JMX for hibernate" );
273
274 for ( Entry<String, EntityManagerFactory> entry : mapFactories.entrySet( ) )
275 {
276 logger.debug( "Registering JMX for hibernate pool : " + entry.getKey( ) );
277
278 HibernateEntityManagerFactory emf = getEntityManagerFactoryImpl( entry.getValue( ) );
279
280 if ( !registerMBean( emf.getSessionFactory( ), entry.getKey( ) ) )
281 {
282 return false;
283 }
284 }
285
286 return true;
287 }
288
289
290
291
292
293
294
295 private boolean registerMBean( SessionFactory sessionFactory, String strPoolName )
296 {
297 MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer( );
298
299 StatisticsService mBean = new StatisticsService( );
300 mBean.setStatisticsEnabled( true );
301 mBean.setSessionFactory( sessionFactory );
302
303 ObjectName name;
304
305 try
306 {
307 name = new ObjectName( "Hibernate:type=statistics-" + strPoolName + ",application=" +
308 AppPropertiesService.getProperty( "lutece.name" ) );
309 mbeanServer.registerMBean( mBean, name );
310 }
311 catch ( Exception e )
312 {
313 logger.error( e.getMessage( ), e );
314
315 return false;
316 }
317
318 return true;
319 }
320
321
322
323
324 public String getName( )
325 {
326 return "HibernateMonitor";
327 }
328 }