tomcat若干问题
背景环境
为了后续能够顺利进行tomcat标准化定制,现在需要对tomcat中的某些问题进行针对性调查。
调查结果
1.tomcat并行类加载在什么情况下启动?
通过在tomcat的conf/context.xml中配置:
,然后启动tomcat就可以了,但是在后台的日志中没有看到,如下类似的日志信息:
INFO: ParallelWebappClassLoader registration succeeded,不知道是什么原因。
在context.xml中添加上面配置来启动并行类加载的原因:
通过看tomcat源码,发现tomcat中包含了并行类加载:
并且在tomcat的org\apache\catalina\loader的mbeans-descriptors.xml中把ParallelWebappClassLoader类写成了一个bean,如下图:
通过在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里面的值。
3. timeBetweenEvictionRunsMillis和validationQuery是通过什么方式关联起来的?
timeBetweenEvictionRunsMillis是每隔多少时间来检测连接有效性;
validationQuery是检测连接有效性的方式;
通过查看tomcat源码没有找到二者的关联关系
但是找到了连接验证的方法:在BasicDataSource类的validateConnectionFactory方法中通过调用PoolableConnectionFactory类的validateConnection方法来进行连接验证,validateConnection方法在PoolableConnectionFactory类中的第72行。
4.连接池中连接创建的时机是什么?
在tomcat启动的时候,连接池被创建,并且在池中设置连接属性,创建连接。
结论依据:当tomcat启动的时候,在tomcat的源码处的某个方法:createConnectionPool()上设置断点,通过debug能够进入到该方法中,说明tomcat在启动的时候调用了该方法同时在该方法中设置了连接属性,具体如下:
同时根据官网给出的一个标签的定义,如下图,可知当连接池被创建的时候,会在连接池中创建一定数量的初始连接数。
上一篇: 银条子
下一篇: 静态、动态代理的若干问题