欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tomcat若干问题

程序员文章站 2022-04-16 21:21:57
...

背景环境
为了后续能够顺利进行tomcat标准化定制,现在需要对tomcat中的某些问题进行针对性调查。
调查结果
1.tomcat并行类加载在什么情况下启动?
通过在tomcat的conf/context.xml中配置:
,然后启动tomcat就可以了,但是在后台的日志中没有看到,如下类似的日志信息:

INFO: ParallelWebappClassLoader registration succeeded,不知道是什么原因。

   在context.xml中添加上面配置来启动并行类加载的原因:

通过看tomcat源码,发现tomcat中包含了并行类加载:
tomcat若干问题
并且在tomcat的org\apache\catalina\loader的mbeans-descriptors.xml中把ParallelWebappClassLoader类写成了一个bean,如下图:
tomcat若干问题
通过在context.xml中配置

              <Loader loaderClass="org.apache.catalina.loader.ParallelWebappClassLoader" />

应该可以启用这个bean来进行并行类加载,但是在启动tomcat后,没有在后台的日志中看到相关的日志信息:INFO: ParallelWebappClassLoader registration succeeded。

2.URL中设定的参数属性和connectionProperties中设定的参数属性的优先级?
参数属性的优先级是由具体方法的定义来实现的,并且通过org.apache.tomcat.jdbc.test.driver.Connection类来对属性值进行了处理。

通过看tomcat源码发现是driver.connect(url,properties)来处理url和properties的,优先级的判断应该与connect方法的定义有关,查看jdk的Javadoc文档,对于connect方法的描述:

Note: If a property is specified as part of the url and is also specified in the Properties object, it is implementation-defined as to which value will take precedence. For maximum portability, an application should only specify a property once.(如果在url和Properties中都定义了一个属性值,那么将由具体方法来定义URL和Properties中属性值的优先级)

在tomcat源码中通过:org\apache\tomcat\jdbc\test\driver\Driver.java类的connect方法来实现了java.sql.Driver(接口)的connect的方法,在该方法中调用org.apache.tomcat.jdbc.test.driver.Connection类对properties进行了处理,忽略了url值,如下图,可能是properties的级别高于url,并且可能是properties中含有了url的相关值,因此才只处理了properties里面的值,忽略了url里面的值。
tomcat若干问题
3. timeBetweenEvictionRunsMillis和validationQuery是通过什么方式关联起来的?
timeBetweenEvictionRunsMillis是每隔多少时间来检测连接有效性;
validationQuery是检测连接有效性的方式;
通过查看tomcat源码没有找到二者的关联关系

但是找到了连接验证的方法:在BasicDataSource类的validateConnectionFactory方法中通过调用PoolableConnectionFactory类的validateConnection方法来进行连接验证,validateConnection方法在PoolableConnectionFactory类中的第72行。

4.连接池中连接创建的时机是什么?
在tomcat启动的时候,连接池被创建,并且在池中设置连接属性,创建连接。
结论依据:当tomcat启动的时候,在tomcat的源码处的某个方法:createConnectionPool()上设置断点,通过debug能够进入到该方法中,说明tomcat在启动的时候调用了该方法同时在该方法中设置了连接属性,具体如下:
tomcat若干问题
同时根据官网给出的一个标签的定义,如下图,可知当连接池被创建的时候,会在连接池中创建一定数量的初始连接数。
tomcat若干问题

相关标签: 中间件