アプリケーション内で以下のようにMbeanを登録してJMXで取得できるようにした際に
Mbeanへの登録は出来ているのに実際のコネクションプールの値が取得できないことがあった。(ソースは若干省き、例外処理とかちゃんと書こうね)
RegisterClass
Context context = new InitialContext();
AtomikosDataSourceBean dataSource= (AtomikosDataSourceBean) context.lookup("java:/comp/env/dataSourceName");
MBean mbean = new Mbean(dataSource);
ObjectName mbeanName = new ObjectName("mbeanName");
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
mbeanServer.registerMBean(mbean,mbeanName);
MBeanClass
AtomikosDataSourceBean dataSource = null;
public MBean(AtomikosDataSourceBean dataSource){
this.dataSource= dataSource;
}
public int getAvailbleSize() {
return (this.dataSource).poolAvailableSize();
}
public int getTotalSize() {
return (this.dataSource).poolTotalSize();
}
取得できなかった原因はアプリケーション内で一度もコネクションが取得されておらず、AtomikosDataSourceBeanが持つConnectionPoolインスタンスが生成されていないことにあった。
そのためConnectionPool.poolAvailableSize();を呼び出した際にヌルポが発生していた。
アプリケーション内で一度でも以下のようにDBにアクセスしていれば以降は値が取得できた。
Connection conn = dataSource.getConnection();
アプリちゃんと動かしてないとコネクションプールは取れないよって話。