数据库连接池的选择及其开发配置

转载自  数据库连接池的选择及其开发配置

一、数据库连接池概述

数据库连接的建立是一种耗时、性能低、代价高的操作,频繁的数据库连接的建立和关闭极大的影响了系统的性能。数据库连接池是系统初始化过程中创建一定数量的数据库连接放于连接池中,当程序需要访问数据库时,不再建立一个新的连接,而是从连接池中取出一个已建立的空闲连接,使用完毕后,程序将连接归还到连接池中,供其他请求使用,从而实现的资源的共享,连接的建立、断开都由连接池自身来管理。

数据库连接池为系统的运行带来了以下优势:昂贵的数据库连接资源得到重用;减少了数据库连接建立和释放的时间开销,提高了系统响应速度;统一的数据库连接管理,避免了连接资源的泄露。

数据库连接池运行机制:

系统初始化时创建连接池,程序操作数据库时从连接池中获取空闲连接,程序使用完毕将连接归还到连接池中,系统退出时,断开所有数据库连接并释放内存资源。

二、主流数据库连接池比较

常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等

1、C3p0: 

开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。单线程,性能较差,适用于小型系统,代码600KB左右。

2、DBCP

DBCP (Database Connection Pool):由Apache开发的一个Java数据库连接池项目, Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。单线程,并发量低,性能不好,适用于小型系统。

3、Tomcat Jdbc Pool:

Tomcat在7.0以前都是使用common-dbcp做为连接池组件,但是dbcp是单线程,为保证线程安全会锁整个连接池,性能较差,dbcp有超过60个类,也相对复杂。Tomcat从7.0开始引入了新增连接池模块叫做Tomcat jdbc pool,基于Tomcat JULI,使用Tomcat日志框架,完全兼容dbcp,通过异步方式获取连接,支持高并发应用环境,超级简单核心文件只有8个,支持JMX,支持XA Connection。

4、BoneCP:

官方说法BoneCP是一个高效、免费、开源的Java数据库连接池实现库。设计初衷就是为了提高数据库连接池性能,根据某些测试数据显示,BoneCP的速度是最快的,要比当时第二快速的连接池快25倍左右,完美集成到一些持久化产品如Hibernate和DataNucleus中。BoneCP特色:高度可扩展,快速;连接状态切换的回调机制;允许直接访问连接;自动化重置能力;JMX支持;懒加载能力;支持XML和属性文件配置方式;较好的Java代码组织,100%单元测试分支代码覆盖率;代码40KB左右。

5、Druid:

Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上。

主流连接池各项功能对比如下:

三、连接池Spring集成配置与JNDI配置

下面针对每一种连接池的使用方法,在开发中如何配置给出spring集成配置和在tomcat的conf/context.xml文件中配置2种方式,限于篇幅只给出基本参数,详细参数可自行研究。

3.1 阿里Druid连接池

Maven依赖

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.28</version>
</dependency>

Spring集成配置方式

<!--Spring Druid 数据源配置-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 -->
<property name="filters" value="stat" />
</bean>Web.xml配置<!--druid WebStatFilter用于采集web-jdbc关联监控的数据--><filter><filter-name>DruidWebStatFilter</filter-name><filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class><init-param><param-name>exclusions</param-name><param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value></init-param></filter><filter-mapping><filter-name>DruidWebStatFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--druid访问监控界面 /druid/index.html--><servlet><servlet-name>DruidStatView</servlet-name><servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class></servlet><servlet-mapping><servlet-name>DruidStatView</servlet-name><url-pattern>/druid/*</url-pattern></servlet-mapping>

Tomcat中context.xml文件JNDI配置方式

com.alibaba.druid.pool.DruidDataSourceFactory实现了javax.naming.spi.ObjectFactory,可以作为JNDI数据源来配置/conf/context.xml配置JNDI方式

 <Resourcename="jdbc/MysqlDataSource"factory="com.alibaba.druid.pool.DruidDataSourceFactory"auth="Container"type="javax.sql.DataSource"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://192.168.1.233:3306/lead_oams?useUnicode=true&characterEncoding=utf-8"username="lead_system"password="password"maxActive="50"maxWait="10000"removeabandoned="true"removeabandonedtimeout="60"logabandoned="false"filters="stat"/>

web.xml配置

 <!--MySQL数据库JNDI数据 --><resource-ref><description>MySQL DB Connection</description><res-ref-name>jdbc/MysqlDataSource</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>

Java代码中获取JNDI数据源

//1、初始化名称查找上下文

 Context ctx =new InitialContext();

//2、通过JNDI名称找到DataSource

 DruidDataSource ds = (DruidDataSource)ctx.lookup("java:comp/env/jdbc/MysqlDataSource");

//3、通过ds获取数据库连接对象

  Connectionconn = ds.getConnection();
3.2 BoneCP连接池

Maven依赖

<dependency><groupId>com.jolbox</groupId><artifactId>bonecp-spring</artifactId><version>0.8.0.RELEASE</version>
</dependency>

Spring集成BoneCP配置方式

<!-- Spring BoneCP 数据源配置--><bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"><!-- 数据库驱动 --><property name="driverClass" value="${jdbc.driver}" /><!-- 相应驱动的jdbcUrl --><property name="jdbcUrl" value="${jdbc.url}" /><!-- 数据库的用户名 --><property name="username" value="${jdbc.username}" /><!-- 数据库的密码 --><property name="password" value="${jdbc.password}" /><!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 --><property name="idleConnectionTestPeriod" value="60" /><!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 --><property name="idleMaxAge" value="30" /><!-- 每个分区最大的连接数 --><property name="maxConnectionsPerPartition" value="150" /><!-- 每个分区最小的连接数 --><property name="minConnectionsPerPartition" value="5" /></bean>

Tomcat中BoneCP使用JNDI配置方式

<Resourcename="JNDIName"auth="Container"type="com.jolbox.bonecp.BoneCPDataSource"factory="org.apache.naming.factory.BeanFactory"driverClass="oracle.jdbc.driver.OracleDriver"username="root" 
password="root" jdbcUrl="jdbc:mysql://localhost:3306/test"idleConnectionTestPeriod="0"idleMaxAge="10"partitionCount="1"maxConnectionsPerPartition="5"minConnectionsPerPartition="1"connectionTestStatement=""initSQL="select 1 from dual"/>

Java代码中获取JNDI数据源

//1、初始化名称查找上下文

  Context ctx =new InitialContext();

//2、通过JNDI名称找到DataSource

 DataSource ds= (DataSource) ctx.lookup("java:comp/env/jdbc/MysqlDataSource");

//3、通过ds获取数据库连接对象

Connectionconn = ds.getConnection();
3.3 Tomcat Jdbc Pool连接池

Maven依赖

<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jdbc</artifactId><version>7.0.75</version>
</dependency>
<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-juli</artifactId><version>7.0.75</version>
</dependency>

Spring集成Tomcat Jbdc Pool配置方式

<!--tomcat jdbc pool数据源配置--> <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"><property name="poolProperties"><bean class="org.apache.tomcat.jdbc.pool.PoolProperties"><!--driverClassName url username password--><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="root"/><!--jmx support--><property name="jmxEnabled" value="true"/><property name="testWhileIdle" value="true"/><property name="testOnBorrow" value="true"/><property name="testOnReturn" value="false"/><property name="validationInterval" value="30000"/><property name="validationQuery" value="SELECT 1"/><property name="timeBetweenEvictionRunsMillis" value="30000"/><!--最大连接--><property name="maxActive" value="50"/><!--初始化连接--><property name="initialSize" value="5"/><!--最长等待时间ms--><property name="maxWait" value="10000"/><property name="minEvictableIdleTimeMillis" value="30000"/><property name="minIdle" value="10"/><!--是否允许日志--><property name="logAbandoned" value="false"/><property name="removeAbandoned" value="true"/><property name="removeAbandonedTimeout" value="60"/><property name="jdbcInterceptors" value="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"/></bean>

Tomcat中context.xml文件JNDI配置方式

<Resource   
name="jdbc/test"  
auth="Container"  
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"  
testWhileIdle="true"  
testOnBorrow="true"  
testOnReturn="false"  
validationQuery="SELECT 1"  
validationInterval="30000"  
timeBetweenEvictionRunsMillis="30000"  
driverClassName="com.mysql.jdbc.Driver"  
maxActive="100"  
maxIdle="40"
maxWait="12000"  
initialSize="10"  
removeAbandonedTimeout="60"  
removeAbandoned="true"  
logAbandoned="true"  
minEvictableIdleTimeMillis="30000"  
jmxEnabled="true"  
jdbcInterceptors=  "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"  
username="root" 
password="root" 
type="javax.sql.DataSource"   
url="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8"/>

Java代码中获取JNDI数据源

//1、初始化名称查找上下文

 Context ctx =new InitialContext();

//2、通过JNDI名称找到DataSource

DataSource ds= (DataSource) ctx.lookup("java:comp/env/jdbc/test");

//3、通过ds获取数据库连接对象

Connectionconn = ds.getConnection();
3.4 Apache DBCP连接池

Maven依赖

<dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version>
</dependency>
<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version>
</dependency>
<dependency><groupId>commons-pool</groupId><artifactId>commons-pool</artifactId><version>1.6</version>
</dependency>

Spring集成DBCP配置方式

 <!-- 配置dbcp数据源 --><bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 池启动时创建的连接数量 -->
<property name="initialSize" value="5"/>
<!-- 同一时间可以从池分配的最多连接数量。设置为0时表示无限制。 -->
<property name="maxActive" value="50"/>
<!-- 池里不会被释放的最多空闲连接数量。设置为0时表示无限制。 -->
<property name="maxIdle" value="10"/>
<!-- 在不新建连接的条件下,池中保持空闲的最少连接数。 -->
<property name="minIdle" value="3"/>
<!-- 设置自动回收超时连接 -->  
<property name="removeAbandoned" value="true" />
<!-- 自动回收超时时间(以秒数为单位) -->  
<property name="removeAbandonedTimeout" value="200"/>
<!-- 设置在自动回收超时连接的时候打印连接的超时错误  --> 
<property name="logAbandoned" value="true"/>
<!-- 等待超时以毫秒为单位,在抛出异常之前,池等待连接被回收的最长时间(当没有可用连接时)。设置为-1表示无限等待。-->  
<property name="maxWait" value="100"/>  </bean>

Tomcat中context.xml文件JNDI配置方式

<Resource name="/jdbc/test" type="javax.sql.DataSource" driverClassName="com.sybase.jdbc3.jdbc.SybDataSource" url="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8" username="root" password="root" initialSize="5"maxActive="50" maxIdle="10" minIdle="3"maxWait="50000" />

Java代码中获取JNDI数据源

//1、初始化名称查找上下文

Context ctx =new InitialContext();

//2、通过JNDI名称找到DataSource

DataSource ds= (DataSource) ctx.lookup("java:comp/env/jdbc/test");

//3、通过ds获取数据库连接对象

Connectionconn = ds.getConnection();
3.5 C3p0连接池

Maven依赖

<dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version>
</dependency>

Spring集成配置方式

<!-- Spring配置c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="100" />
<!--连接池中保留的最小连接数。-->
<property name="minPoolSize" value="1" />
<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="10" />
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="30" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="5" />
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。Default: 0-->
<property name="maxStatements" value="0" />
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="60" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="30" />
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。Default: false-->
<property name="breakAfterAcquireFailure" value="true" />
<!--因性能消耗大请只在需要的时候使用它。Default: false -->
<property name="testConnectionOnCheckout"  value="false" />
</bean>

Tomcat中context.xml文件JNDI配置方式

<Resource name="jdbc/MysqlDataSource" auth="Container"factory="org.apache.naming.factory.BeanFactory" type="com.mchange.v2.c3p0.ComboPooledDataSource"driverClass="com.mysql.jdbc.Driver"idleConnectionTestPeriod="60"maxPoolSize="50" minPoolSize="2"acquireIncrement="2" user="root" password="root"jdbcUrl="jdbc:mysql://localhost:3306/test"/>

Java代码中获取JNDI数据源

//1、初始化名称查找上下文

Context ctx =new InitialContext();

//2、通过JNDI名称找到DataSource

DataSource ds= (DataSource) ctx.lookup("java:comp/env/jdbc/MysqlDataSource");

//3、通过ds获取数据库连接对象

Connectionconn = ds.getConnection();
总结

本文所比较的5种数据库连接池在性能方面,根据个人测试结果和参考网上资料Druid > TomcatJDBC > DBCP > C3P0,BoneCP的性能方面没有深入比较,应该和Tomcat Jdbc差不多。

对于小型的系统,并发压力不大时,选择哪一种数据库连接池差别不会很大,主要考虑的应该是连接池的稳定性。当并发量较高时,一般不会选择使用DBCP和C3P0,选择Druid是较好的。

本文给出了5种数据库连接池通过Spring配置和Tomcat JNDI方式配置两种方式,Spring配置一般使用单独的属性文件,每一个连接池都提供了使用代码创建的方式,使用方式也比较类似,感兴趣可以自行研究。

另外连接不同的数据库时,在配置方面的差异主要在driverClass和jdbcUrl两项,优化配置项可以另行考虑。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#在Linux+Mono环境中使用微信支付证书

最近特殊的需求&#xff0c;要把微信平台一个功能页面部署到Linux&#xff08;CentOS6.5&#xff09;下&#xff0c;其中涉及到微信支付退款。 鉴于之前实践过monojexusasp.net mvc的部署&#xff0c;于是问题重点在于解决对商户证书的调用问题。 查看微信支付官方文档关于证书…

mysql切换用户sql语句,MySQL用户管理及SQL语句详解

[(none)]>select user,host frommysql.user; #查询用户和主机--------------------------| user | host |--------------------------| root | 10.0.0.% || mysql.session | localhost || mysql.sys | localhost || root | localhost |--------------------------4 rows in …

其他

关于程序员的文章 2014年05月01日 16:58:25 a8511119 阅读数&#xff1a;300 中国有很多小朋友&#xff0c;他们18,9岁或21,2岁&#xff0c;通过自学也写了不少代码&#xff0c;他们有的代码写的很漂亮&#xff0c;一些技术细节相当出众&#xff0c;也很有钻研精神&#xff0…

Java经典面试题一

转载自 Java经典面试题一 题目一 面向对象的特征有哪些方面&#xff1f; 答&#xff1a;面向对象的特征主要有以下几个方面&#xff1a; 1.抽象&#xff1a; 抽象是将一类对象的共同特征总结出来构造类的过程&#xff0c;包括数据抽象和行为抽象两方面。抽象只关注对象有哪些…

微信小程序这么火,到底会对C#开发者带来怎样的改变

在9月22日凌晨&#xff0c;微信公众平台开始陆续对外发出小程序的内测邀请&#xff0c;小程序也立即成为被外界广为关注的微信“应用号"&#xff0c;9月23日的福州 2016腾讯全球合作伙伴大会上&#xff0c;腾讯COO、游戏和无线业务的掌舵人、腾讯首席运营官任宇任宇昕提到…

php js 验证码,js实现验证码的方法

验证码的生命周期在web应用中&#xff0c;验证码常用于登录注册。验证码本质就是一张图片。我们来看一下验证码的生命周期&#xff1a;客户端请求验证码服务端渲染验证码&#xff1a;渲染一张包含随机字符串的图片随机字符串写入session读取图片并返回响应客户端提交&#xff1…

区间数多属性决策matlab,区间数多属性决策的改进理想解法

Interval Multiple Attribute Decision Making Based on the Improved Technique for Order Preference by Similarity to Ideal Solution1、School of Economics and Management, Southwest Jiaotong University2、Deaprtment of Mathematics, North Sichuan Medical CollegeA…

.NET 标准介绍

本文介绍如何使用 .NET 标准&#xff0c;更容易地实现向 .NET Core 迁移。文中会讨论计划包含的 APIs&#xff0c;跨构架兼容性如何工作以及这对 .NET Core 意味着什么。 如果你对细节感兴趣&#xff0c;这篇文章正是为你准备的&#xff1b;如果你没有那么多时间或者对细节并不…

HTTP 返回码详解

转载自 HTTP 返回码详解200 服务器成功返回网页 404 请求的网页不存在 503 服务不可用1xx&#xff08;临时响应&#xff09; 表示临时响应并需要请求者继续执行操作的状态代码。 100&#xff08;继续&#xff09;请求者应当继续提出请求。 服务器返回此代码表示已收到请求…

银行营业网点管理系统——entity类(Branches)

package BranchesMgr.entity; /*** * author Administrator*网点信息表*/ public class Branches {private int id;private String name;private int cityAreatyid;private String cityName;public String getCityName() {return cityName;}public void setCityName(String cit…

自己的php工具,用PHP自己编写的站长工具箱

前沿&#xff1a; 看到站长之家的站长工具很强大&#xff0c;所以也想自己试着实现一些其中的功能&#xff0c;由于本人只具有初阶的php技术&#xff0c;所以便用php一些函数实现了部分功能。主要功能包括&#xff1a;正则表达式测试工具&#xff0c;MD5和SHA1加密工具&#xf…

轻量级的web框架[Nancy On .Net Core Docker]

.net core现在已经有了大的发展&#xff0c;虽然笔者现在已经从事python开发&#xff0c;但是一直在关注.net的发展&#xff0c;在逛博客园的时候&#xff0c;发现有大家都会提到Nancy这个框架&#xff0c;在简单的使用之后&#xff0c;发现竟然是如此的简单而优雅 public cla…

Git使用中的一些奇技淫巧

转载自 Git使用中的一些奇技淫巧Git作为当今最流行的分布式代码版本管理系统&#xff0c;它的出现改变了软件的开发流程&#xff0c;大大地提高了开发流畅度。 本人使用Git也有一段时间了&#xff0c;一直都只是使用一些最最基本的几个命令&#xff0c;对于不复杂的代码工程来…

oracle 更新参数,Oracle动态、静态参数参数修改规则

首先&#xff0c;查看要修改的oracle参数的属性(动态or静态)SQL> select name,value,isses_modifiable,issys_modifiable from V$PARAMETER where namemax_dump_file_size;注&#xff1a;isses_modifiable 为Y&#xff0c;session级别修改的参数&#xff0c;SQL>alter se…

银行营业网点管理系统——entity类(CityArea)

package BranchesMgr.entity; /*** 城区表* author Administrator**/ public class CityArea {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(Stri…

漫画:如何用Zookeeper实现分布式锁?

转载自 漫画&#xff1a;如何用Zookeeper实现分布式锁&#xff1f;什么是临时顺序节点&#xff1f;让我们来回顾一下Zookeeper节点的概念&#xff1a;Zookeeper的数据存储结构就像一棵树&#xff0c;这棵树由节点组成&#xff0c;这种节点叫做Znode。Znode分为四种类型&#…

使用CoreProfiler/NanoProfiler实现跨平台amp;应用的整合性能调试

NanoProfiler是一个开源.NET性能调试类库&#xff0c;CoreProfiler是其.NET Core版本的实现。在之前的一些文章中&#xff0c;我曾介绍过NanoProfiler的主要使用方式&#xff0c;以及如何为生产环境&#xff0c;基于ELK对应用性能进行调试和监控。不过&#xff0c;对于一般的用…