基于JMX监控下的JBoss数据库连接池

开发 前端
JMX(Java Management Extensions, Java管理扩展)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。

一、JMX简介

JMX(Java Management Extensions,Java管理扩展)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。

Jboss的成功就在于采用了JMX,从零开始、模块化开发了Jboss服务器和容器,实现了模块化、嵌入式的技术架构。JMX作为集成中心(总线),可以很方便的热插拔新的模块和组件。JMX服务可以通过HTTP、RMI、SNMP等多种协议进行访问,使其适合作为一个网络管理、监控平台的技术架构。

二、JMX构架中的各层及相关的组件

1.工具层(Instrumentation Level)

(a)MBeans(标准的,动态的,开放的和模型MBeans)

(b)通知模型:Notification、NotificationListener等类

(c)MBean元数据类:Attribute、Opreator等类

2.代理层(Agent Level)

(a)MBean Server

(b)代理服务。如jboss jmx-console下的HtmlAdaptorServer等。

MBean:是Managed Bean的简称。在JMX中MBean代表一个被管理的资源实例,通过MBean中暴露的方法和属性,外界可以获取被管理的资源的状态和操纵MBean的行为。事实上,MBean就是一个Java Object,同JavaBean模型一样,外界使用自醒和反射来获取Object的值和调用Object的方法,只是MBean更为复杂和高级一些。

MBeanServer:MBean生存在一个MBeanServer中。MBeanServer管理这些MBean,并且代理外界对它们的访问。并且MBeanServer提供了一种注册机制,是的外界可以通过名字来得到相应的MBean实例。

JMX Agent:Agent只是一个Java进程,它包括这个MBeanServer和一系列附加的MbeanService。当然这些Service也是通过MBean的形式来发布。

Protocol Adapters and Connectors

JMX Agent通过各种各样的Adapter和Connector来与外界(JVM之外)进行通信。同样外界(JVM之外)也必须通过某个Adapter和Connector来向JMX Agent发送管理或控制请求。

Adapter和Connector的区别在于:Adapter是使用某种Internet协议来与JMX Agent获得联系,Agent端会有一个对象(Adapter)来处理有关协议的细节。比如SNMP Adapter和HTTP Adapter。而Connector则是使用类似RPC的方式来访问Agent,在Agent端和客户端都必须有这样一个对象来处理相应的请求与应答。比如RMI Connector。

JMX Agent可以带有任意多个Adapter,因此可以使用多种不同的方式访问Agent。#p#

三、监控jboss数据库连接池的实现

TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=#999999 border=1>
import java.util.Iterator; 
 
import java.util.Properties;

import java.util.Set;

import javax.management.MBeanInfo;

import javax.management.MBeanOperationInfo;

import javax.management.MBeanParameterInfo;

import javax.management.ObjectInstance;

import javax.management.ObjectName;

import javax.naming.InitialContext;

import org.jboss.jmx.adaptor.rmi.RMIAdaptor;

public class DataSourceManger {

public static void main(String[] args) {

// TODO 自动生成方法存根

try {

// Get RMIAdaptor Object

Properties pro = new Properties();

pro.setProperty("java.naming.factory.initial",

"org.jnp.interfaces.NamingContextFactory");

pro.setProperty("java.naming.provider.url", "jnp://localhost:1099");

pro.setProperty("java.naming.factory.url.pkgs",

"org.jboss.naming:org.jnp.interfaces");

InitialContext ic = new InitialContext(pro);

RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/rmi/RMIAdaptor");

ObjectName name = new ObjectName(

"jboss.jca:name=jdbc/baosigpo,service=ManagedConnectionPool");

ObjectName lname = new ObjectName(

"jboss.jca:name=jdbc/baosigpo,service=LocalTxCM");

String AvailableConnectionCount = server.getAttribute(name,

"AvailableConnectionCount").toString();

System.out.println("===========avlide============"

+ AvailableConnectionCount);

String InUseConnectionCount = server.getAttribute(name,

"InUseConnectionCount").toString();

System.out.println("===========InUseConnectionCount============"

+ InUseConnectionCount);

String ConnectionCreatedCount = server.getAttribute(name,

"ConnectionCreatedCount").toString();

System.out.println("===========ConnectionCreatedCount============"

+ ConnectionCreatedCount);

String ConnectionDestroyedCount = server.getAttribute(name,

"ConnectionDestroyedCount").toString();

System.out

.println("===========ConnectionDestroyedCount============"

+ ConnectionDestroyedCount);

ConnectionDestroyedCount = server.getAttribute(name,

"ConnectionDestroyedCount").toString();

System.out

.println("===========ConnectionDestroyedCount============"

+ ConnectionDestroyedCount);

String[] argTypes = new String[0];

int i=0;

i=Integer.parseInt(AvailableConnectionCount);

Object opReturn=null;

if(i<1) {//监控可用连接数。

StringBuffer sb=new StringBuffer();

sb.append("oper before DataSource Pool info : \r\n");

sb.append("AvailableConnectionCount="

+ AvailableConnectionCount);

sb.append("InUseConnectionCount="+InUseConnectionCount);

sb.append("ConnectionCreatedCount="

+ ConnectionCreatedCount);

sb.append("ConnectionDestroyedCount="

+ ConnectionDestroyedCount);

sb.append("\r\n");

//opReturn=server.invoke(name,"flush",argTypes,argTypes);

/*调用mbean的方法释放连接 begin 本实现方法对应jboss3.2.3

对于jboss4以后的版本只需调用

//opReturn=server.invoke(name,"flush",argTypes,argTypes);

**/

opReturn=server.invoke(name,"stop",argTypes,argTypes);

opReturn=server.invoke(name,"start",argTypes,argTypes);

opReturn=server.invoke(lname,"stop",argTypes,argTypes);

opReturn=server.invoke(lname,"start",argTypes,argTypes);

/*调用mbean的方法释放连接 end **/

AvailableConnectionCount=server.getAttribute(name,

"AvailableConnectionCount").toString();

InUseConnectionCount=server.getAttribute(name,

"InUseConnectionCount").toString();

ConnectionCreatedCount=server.getAttribute(name,

"ConnectionCreatedCount").toString();

ConnectionDestroyedCount =server.getAttribute(name,

"ConnectionDestroyedCount").toString();

ConnectionDestroyedCount=server.getAttribute(name,

"ConnectionDestroyedCount").toString();

sb.append("oper afer DataSource Pool info :\r\n");

sb.append("AvailableConnectionCount="

+ AvailableConnectionCount);

sb.append("InUseConnectionCount="+InUseConnectionCount);

sb.append("ConnectionCreatedCount="

+ ConnectionCreatedCount);

sb.append("ConnectionDestroyedCount="

+ ConnectionDestroyedCount);

//writeLog(sb.toString()); 操作日志信息

System.out.println("===========op SUCCESS============");

}

}catch(Exception ex){

ex.printStackTrace();

}

}

}
  • 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.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.

【编辑推荐】

  1. JBoss应用服务器5.0正式发布
  2. JBoss Web和Tomcat的区别
  3. JBoss推出Developer Studio 1.0和Tools 2.0
责任编辑:田超 来源: IT专家网论坛
相关推荐

2009-06-16 09:25:31

JBoss配置

2009-06-24 07:53:47

Hibernate数据

2010-03-18 15:09:15

python数据库连接

2019-11-27 10:31:51

数据库连接池内存

2017-06-22 14:13:07

PythonMySQLpymysqlpool

2018-10-10 14:27:34

数据库连接池MySQL

2009-07-17 13:32:49

JDBC数据库

2011-05-19 09:53:33

数据库连接池

2018-01-03 14:32:32

2011-08-09 15:25:14

线程池数据库连接池

2021-08-12 06:52:01

.NET数据库连接池

2020-04-30 14:38:51

数据库连接池线程

2009-07-03 17:37:54

JSP数据库

2009-06-16 11:11:25

JBoss目录数据库连接

2009-07-29 09:33:14

ASP.NET数据库连

2025-01-16 10:30:49

2010-03-18 14:55:17

Python数据库连接

2011-07-29 15:11:42

WeblogicOracle数据库连接

2010-10-26 16:15:33

连接Oracle数据库

2025-02-07 12:11:52

点赞
收藏

51CTO技术栈公众号