oracle数据库连接池 数据字段过长占用jboss 连接池么

通过JMX监控Jboss数据库连接池
通过JMX监控Jboss数据库连接池
  一、 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。
  三、监控jboss数据库连接池的实现
&&&&& import java.util.I
  import java.util.P
  import java.util.S
  import javax.management.MBeanI
  import javax.management.MBeanOperationI
  import javax.management.MBeanParameterI
  import javax.management.ObjectI
  import javax.management.ObjectN
  import javax.naming.InitialC
  import org.jboss.jmx.adaptor.rmi.RMIA
  public class DataSourceManger {
  public static void main(String[] args) {
  // TODO 自动生成方法存根
  // 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 =
  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();
关注微信,获得更多免费资源
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
港口与航道工程建设工程法规及相关知识建设工程经济考试大纲矿业工程市政公用工程通信与广电工程
操作系统汇编语言计算机系统结构人工智能数据库系统微机与接口
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
Powerpoint教程WPS教程
电子政务客户关系管理首席信息官办公自动化大数据
职称考试题目
就业指导签约违约职业测评
招生信息考研政治
网络安全安全设置工具使用手机安全
3DMax教程Flash教程CorelDraw教程Director教程
Dreamwaver教程HTML教程网站策划网站运营Frontpage教程
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
互联网电信IT业界IT生活
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
组织运营财务资本
视频播放文件压缩杀毒软件输入法微博
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&解决Tomcat数据连接池无法释放 | 张戈博客
大家都在看
博客宗旨 把最实用的经验,分享给最需要的读者,希望每一位来访的朋友都能有所收获!
<span class="tipso_style" id="tip-w" data-tipso=''>
浏览 3823287
留言 14260
随便挑了些,看你喜欢嘛
更多精彩关于博客 张戈博客是关注互联网以及分享IT运维工作经验的个人博客,主要涵盖了操作系统运维、实用脚本编程以及博客网站建设等经验教程。我的博客宗旨:把最实用的经验,分享给最需要的读者,希望每一位来访的朋友都能有所收获!
微信公众号<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&各种数据库连接池配置比较
数据库用户名称
数据库密码
DriverClassName
DriverClassName
DriverClass
driver-class
DriverName
JDBC连接串
connection-url
JDBC连接属性
Properties
Properties
Properties
connection-property
Properties
初始化大小
InitialSize
InitialSize
InitialPoolSize
Initial Capacity
连接池最小空闲
MinPoolSize
min-pool-size
连接池最大空闲
连接池最大使用连接数量
MaxPoolSize
max-pool-size
MaximumCapacity
最小逐出时间
MinEvictableIdleTimeMillis
MinEvictableIdleTimeMillis
idle-timeout-minutes
InactiveConnectionTimeoutSeconds
最多等待线程
MaxWaitThreadCount
MaxWaitThreadCount
HighestNumWaiters
连接池增长步长
AcquireIncrement
CapacityIncrement
获取连接时测试是否有效
TestOnBorrow
TestOnBorrow
TestConnectionOnCheckout
归还连接时是否测试有效
TestOnReturn
TestOnReturn
TestConnectionOnCheckin
TestConnectionsOnReserve
测试有效用的SQL Query
ValidationQuery
ValidationQuery
PreferredTestQuery
check-valid-connection-sql
测试有效的超时时间
ValidationQueryTimeout
ValidationQueryTimeout
连接初始化SQL
ConnectionInitSqls
ConnectionInitSqls
new-connection-sql
连接最大存活实现
MaxConnectionAge
连接泄漏的超时时间
RemoveAbandonedTimeout
RemoveAbandonedTimeout
UnreturnedConnectionTimeout
关闭泄漏的连接时打印堆栈信息
LogAbandoned
LogAbandoned
DebugUnreturnedConnectionStackTraces
逐出连接的检测时间间隔
TimeBetweenEvictionRunsMillis
TimeBetweenEvictionRunsMillis
ShrinkFrequencySeconds
Statement缓存算法
StatementCacheType
Statement缓存大小
MaxPoolPreparedStatementPerConnectionSize
prepared-statement-cache-size
StatementCacheSize
获取连接最大等待时间
blocking-time-millis
FatalException处理
ExceptionSorter
exception-sorter-class-name
调用原生方法检测连接是否有效
ValidConnectionCheckerClassName
valid-connection-checker-class-name
检测未关闭Statement
缺省打开,无法配置
track-statements
TestTableName
SecondsToTrustAnIdlePoolConnection
ConnectionCreationRetryFrequencySeconds
LoginDelaySeconds
Profile Connection Usage
获取连接等待统计
NotEmptyWait
Profile Connection Reservation Wait
Profile Connection Leak
Profile Connection Reservation Failed
Profile Statement Cache Entry
Profile Statement Usage
Profile Connection Last Usage
Profile Connection Multithreaded Usage
Profile Harvest Frequency Seconds
连接池扩展
DriverInterceptor
CredentialMappingEnabled
ConnectionReserveTimeoutSeconds
Statement执行超时时间
QueryTimeout
StatementTimeout
连接池关闭时对正在使用连接的处理方式
IgnoreInUseConnectionsEnabled
把连接放到ThreadLocal中
PinnedToThread
关闭“赃”连接(调用过getVendorConnection方法)
RemoveInfectedConnections
类型映射配置
type-mapping
事务隔离级别
DefaultTransactionIsolation
DefaultTransactionIsolation
transaction-isolation
ReadOnly设置
DefaultReadOnly
DefaultReadOnly
AutoCommit设置
DefaultAutoCommit
DefaultAutoCommit
参考:/content/12/60.shtml
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。数据库(2)
引言:为什么prefill=false会在启动的时候碰到连接风暴,本节结合JBOSS源代码的来分析这种情况产生的根本原因,最后给出几种方案来解决这种连接数突然飙升的问题。(prefill这个参数在jboss4.0.5版本以后才能够被支持)
连接风暴,听起来这个词很时髦,那么到底什么是连接风暴?在百度和google上搜索了下,都没有找到相关的解释。所谓连接风暴,我们也可以称之为访问风暴,这是在使用jboss默认参数prefill=false的情况下,大规模应用集群很容易碰到的问题。先来描述一个场景:
在项目发布的过程中,我们需要重启应用,当应用启动的时候,经常会碰到各应用的连接数异常飙升。假设连接数的设置为:min&#20540;3,max&#20540;10。正常的业务使用连接数在5个左右,当重启应用时,各应用连接数可能会飙升到10个,瞬间甚至还有可能部分应用会报取不到连接。启动完成后接下来的时间内,连接开始慢慢返回到业务的正常&#20540;。这种场景,就是碰到了所谓的连接风暴。
知道了连接风暴的场景,那么它到底有什么危害呢,简单来说产要有以下几点(这些都是实际碰到的情况):
1. 在多个应用系统同时启动时,系统大量占用连接资源,可能导致连接数耗尽。
2.&创建连接的能力是有限的,并且是非常耗时和消耗CPU等资源的,突然大量请求落到上,极端情况下可能导致异常crash。
3. 对于应用系统来说,多一个连接也就多占用一点资源。在启动的时候,连接会填充到max&#20540;,并有可能导致瞬间业务请求失败。
为什么我们的应用系统会在启动时会产生连接风暴。前面第二节我们已经介绍了jboss在启动的时候,有一个参数 & prefill &,这个参数决定了启动时是否初始化的连接,默认设置为false,即启动时不初始化min&#20540;连接数。min&#20540;的初始化在业务请求调用的第一次getConnection时进行。
下面来看一下,getConnection的基本流程:(
假设min&#20540;:9,max&#20540;:20,我们结合上图来分析一下应用启动时的场景。因为创建一个连接需要耗费的时间在80-100ms。在启动的时候,80ms之内,如果发生了并发的10个getConnection操作(假设这10个getConnection都不能被复用),则会怎么样呢?一共会创建多少个连接呢?
在80ms之内,第一个并发getConnection会执行filltoMin(创建9个连接),其它的9个并发请求会各自独立的创建一个连接,所以一共会创建9&#43;9=18个连接。这个过程的流程图如下:
在实际执行filltoMin操作需要9*80ms=720ms左右,即在80ms,160ms,240ms的时候,会分别创建1个连接,创建的连接,马上就可以被使用。所以,连接风暴会在最初的80ms内非常明显。
当这18个连接被创建后,我们前面在章节&JBOSS连接池的初始化及关闭中已经提到,连接池初始化的时候会把当前连接池注册到IdleRemove线程中,对于空闲30分钟以上的连接会进行定时清理,这个定时任务每隔15分钟运行一次。所以定时任务执行时,会清理空闲时间在30分钟-45分钟的空闲连接。因此,在最多45分钟之后,连接又可以回落到正常的业务&#20540;。
了解了连接风暴的原理后,我们可以思考一下。这是目前总结的三种方案:
1. 设置jboss连接池参数prefill=true,即在启动时将连接数填充到min&#20540;。
2. 不设置prefill,在启动完成,业务正常运行,应用先执行一个SQL(如可以执行:select * from dual),将连接数填充到min&#20540;。
3. 选择在业务低峰时重启系统。
以上三种方案中,第一种是最简单的,也不需要任何的修改。第二种方案有点麻烦,实现的方式和第一种方案本质上一样,进行连接预加载。我碰到过有的系统实现了这种方案,并且预加载了PreparedStatementCache。当然,我觉得意义并不是很大,不知道为什么会有人选择这种方式来实现,只能猜想也许是并不知道第一种方式的存在。第三种方案,不用说了,治标不治本。
总结三种方案,我们可以通过简单的设置prefill=true来解决连接风暴的问题。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:84556次
积分:1109
积分:1109
排名:千里之外
原创:14篇
转载:85篇
评论:10条
(8)(1)(1)(1)(1)(1)(4)(1)(1)(2)(2)(1)(1)(1)(1)(1)(1)(5)(1)(2)(13)(28)(21)

我要回帖

更多关于 jboss 连接池 的文章

 

随机推荐