近日项目需要多个数据库在同一方法中查询,考虑到分布式效率低下,资源消耗严重,就直接配置了6个数据源,6个sqlSessionFactory,3个读库3个写库,数据库使用mysql,本地测试没有任何问题,没有使用jmetter等测试工具进行并发测试,因此导致了一个严重BUG:cpu占用近100%;
检查了代码及其他配置,都没发现问题所在,直到一同事开启trace级别日志;
每次发送链接完数据库都会去扫描N多mapper.xml mybatis的sql文件!!!
只要找到问题,也就好解决了,原来的配置文件
<bean id="writeSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="prototype">
<property name="dataSource" ref="write" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mapping/*/*/*.xml"></property>
</bean>
<bean id="readSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="prototype">
<property name="dataSource" ref="read" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mapping/*/*/*.xml"></property>
</bean>
<bean id="writeSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="writeSqlSessionFactory" />
</bean>
<bean id="readSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="readSqlSessionFactory" />
</bean>
相信大多数人和我一样觉得他没什么问题,可是问题就出在扫描上,一般都不会太注意,scope配置成多例,会造成每次都去扫描mapper文件,让资源消耗严重,去掉或者配置成单例就没问题了,scope=‘singleton'
更改之后的文件
<bean id="writeSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="write" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mapping/*/*/*.xml"></property>
</bean>
<bean id="readSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="read" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mapping/*/*/*.xml"></property>
</bean>
<bean id="writeSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="writeSqlSessionFactory" />
</bean>
<bean id="readSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="readSqlSessionFactory" />
</bean>