一、纯 mybatis 项目(无 spring)
纯 mybatis 有两种方式配置第三方连接池:
方式一:自定义 datasourcefactory
原理:mybatis 内置只支持 pooled/unpooled/jndi,没有 hikaricp/druid 的内置支持。
通过自定义工厂类,让 mybatis 能创建第三方连接池。
1. 添加 maven 依赖
<!-- mybatis -->
<dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis</artifactid>
<version>3.5.13</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>8.0.33</version>
</dependency>
<!-- 连接池:三选一 -->
<!-- hikaricp -->
<dependency>
<groupid>com.zaxxer</groupid>
<artifactid>hikaricp</artifactid>
<version>5.0.1</version>
</dependency>
<!-- 或 druid -->
<dependency>
<groupid>com.alibaba</groupid>
<artifactid>druid</artifactid>
<version>1.2.20</version>
</dependency>2. 编写自定义工厂类
hikaricp 版本:
package com.example.factory;
import com.zaxxer.hikari.hikariconfig;
import com.zaxxer.hikari.hikaridatasource;
import org.apache.ibatis.datasource.datasourcefactory;
import javax.sql.datasource;
import java.util.properties;
public class hikaridatasourcefactory implements datasourcefactory {
private properties props;
// mybatis 自动调用,传入 xml 里的 <property>
@override
public void setproperties(properties props) {
this.props = props;
}
// mybatis 调用此方法获取 datasource
@override
public datasource getdatasource() {
// 用 properties 创建 hikaricp 配置
hikariconfig config = new hikariconfig(props);
// 返回连接池实例
return new hikaridatasource(config);
}
}druid 版本:
package com.example.factory;
import com.alibaba.druid.pool.druiddatasource;
import com.alibaba.druid.pool.druiddatasourcefactory;
import org.apache.ibatis.datasource.datasourcefactory;
import javax.sql.datasource;
import java.util.properties;
public class druiddatasourcefactory implements datasourcefactory {
private properties props;
@override
public void setproperties(properties props) {
this.props = props;
}
@override
public datasource getdatasource() {
try {
return druiddatasourcefactory.createdatasource(props);
} catch (exception e) {
throw new runtimeexception("创建 druiddatasource 失败", e);
}
}
}3. mybatis 配置文件mybatis-config.xml
<?xml version="1.0" encoding="utf-8"?>
<!doctype configuration
public "-//mybatis.org//dtd config 3.0//en"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="dev">
<environment id="dev">
<transactionmanager type="jdbc"/>
<!-- type 填自定义工厂类的全限定名 -->
<datasource type="com.example.factory.hikaridatasourcefactory">
<!-- 这些属性会被收集成 properties 传给 setproperties() -->
<property name="driverclassname" value="com.mysql.cj.jdbc.driver"/>
<property name="jdbcurl" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- hikaricp 参数 -->
<property name="maximumpoolsize" value="20"/>
<property name="minimumidle" value="5"/>
<property name="connectiontimeout" value="30000"/>
<property name="idletimeout" value="600000"/>
<property name="maxlifetime" value="1800000"/>
</datasource>
</environment>
</environments>
<!-- mapper 注册 -->
<mappers>
<mapper resource="mapper/usermapper.xml"/>
</mappers>
</configuration>4. java 代码中使用
public class main {
public static void main(string[] args) throws ioexception {
// 读取配置文件
inputstream inputstream = resources.getresourceasstream("mybatis-config.xml");
// 构建 sqlsessionfactory
sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream);
// 获取 sqlsession
try (sqlsession session = sqlsessionfactory.opensession()) {
usermapper mapper = session.getmapper(usermapper.class);
user user = mapper.selectbyid(1);
system.out.println(user);
}
}
}【注意】:
方式一,不需要tomcat容器!
整个过程和 tomcat 没有任何关系,就是一个普通的 java 程序,用 main() 方法就能直接跑。
方式二:jndi 方式
原理:连接池不由 mybatis 创建,而是由 tomcat 等 web 容器提前配置好,mybatis 通过 jndi 名称去"查找"获取。
适用场景
- 多应用共享同一个连接池
- 数据库密码不写在应用代码里
- 企业级 war 包部署到外部 tomcat
jndi 方式的本质
┌─────────────────────────────────────┐
│ tomcat 服务器 │
│ ┌─────────────────────────────┐ │
│ │ context.xml 里配置: │ │
│ │ - 数据库密码 │ │
│ │ - 连接池参数 │ │
│ │ - 连接池实现(druid等) │ │
│ │ │ │
│ │ 对外暴露:name="jdbc/mydb" │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
↑
jndi 查找(按名字)
↓
┌─────────────────────────────────────┐
│ mybatis 应用(war包) │
│ │
│ mybatis-config.xml 里只有: │
│ <datasource type="jndi"> │
│ <property name="data_source" │
│ value="java:comp/env/ │
│ jdbc/mydb"/> │
│ </datasource> │
│ │
│ ❌ 没有数据库密码 │
│ ❌ 没有连接池参数 │
│ ❌ 不知道用的是 druid 还是 hikari │
└─────────────────────────────────────┘为什么企业级部署常用 jndi?
场景:一个 tomcat 跑 3 个应用
不用 jndi(每个应用自己配)
应用a:配了 hikaricp,max=10,密码=123456 应用b:配了 druid,max=10,密码=123456 应用c:配了 c3p0,max=10,密码=123456 → 总共 30 个连接,密码改了要改 3 个地方
用 jndi(统一配置)
tomcat 配 1 个连接池:max=20,密码=123456 应用a、b、c 都引用 jdbc/mydb → 总共 20 个连接,密码改了只改 1 个地方
一句话总结
jndi 方式 = 把数据库配置"外包"给 tomcat
mybatis 只负责说"给我 jdbc/mydb",具体怎么连、用什么连、密码是什么,全由 tomcat 管。
这和 spring 无关,是 纯 mybatis 项目在企业部署时的标准做法。
1. 在 tomcat 中配置连接池
找到 tomcat/conf/context.xml,添加:
<context>
<!-- 给连接池起个名字:jdbc/mydb -->
<resource
name="jdbc/mydb"
auth="container"
type="javax.sql.datasource"
<!-- 连接池实现:可换 druid、dbcp、hikaricp 等 -->
factory="com.alibaba.druid.pool.druiddatasourcefactory"
<!-- 数据库基本信息 -->
driverclassname="com.mysql.cj.jdbc.driver"
url="jdbc:mysql://localhost:3306/mydb"
username="root"
password="123456"
<!-- 连接池参数 -->
maxactive="20"
maxidle="10"
maxwait="10000"
/>
</context>不同连接池只需改 factory 和参数名:
| 连接池 | factory 值 | 参数特点 |
|---|---|---|
| druid | com.alibaba.druid.pool.druiddatasourcefactory | maxactive, maxwait |
| dbcp | org.apache.tomcat.dbcp.dbcp2.basicdatasourcefactory | maxtotal, maxwaitmillis |
| hikaricp | com.zaxxer.hikari.hikarijndifactory | maximumpoolsize, connectiontimeout |
2. mybatis 配置文件mybatis-config.xml
<?xml version="1.0" encoding="utf-8"?>
<!doctype configuration
public "-//mybatis.org//dtd config 3.0//en"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="dev">
<environment id="dev">
<transactionmanager type="jdbc"/>
<!-- type="jndi",只需填名字 -->
<datasource type="jndi">
<!-- java:comp/env/ 是 jndi 标准前缀 -->
<property name="data_source" value="java:comp/env/jdbc/mydb"/>
</datasource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/usermapper.xml"/>
</mappers>
</configuration>关键点:
- type="jndi":告诉 mybatis,"我不自己创建连接池,去服务器上找"
- java:comp/env/:这是 jndi 的标准前缀(就像打电话要加区号)
- jdbc/mydb:就是 tomcat 里配置的那个名字
3. 项目打包为 war 部署到 tomcat
<!-- pom.xml -->
<packaging>war</packaging>
<dependencies>
<!-- servlet api(provided,tomcat 自带) -->
<dependency>
<groupid>javax.servlet</groupid>
<artifactid>javax.servlet-api</artifactid>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- mybatis -->
<dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis</artifactid>
<version>3.5.13</version>
</dependency>
</dependencies>完整流程图
┌─────────────────┐
│ tomcat 服务器 │
│ ┌───────────┐ │
│ │ druid连接池 │ ← 统一管理:20个连接
│ │ name= │ │
│ │ jdbc/mydb │ │
│ └─────┬─────┘ │
└────────┼────────┘
│
jndi 查找(按名字要)
│
┌────────┼────────┐
│ mybatis 应用 │
│ "给我 jdbc/mydb" │
│ (不知道真实密码) │
└─────────────────┘注意:
不同的连接池,比如:c3p0、dbcp,就直接修改tomcat配置文件中的factory="com.alibaba.druid.pool.druiddatasourcefactory",其他的不用变就行了
两种"纯 mybatis"方式的对比
| 自定义 datasourcefactory | jndi 方式 | |
|---|---|---|
| 连接池在哪创建 | mybatis 应用内部 | tomcat 服务器里 |
| 谁管理连接池 | mybatis 自己 | tomcat 容器 |
| 密码存在哪 | mybatis-config.xml 里 | tomcat 的 context.xml 里 |
| 应用是否知道密码 | ✅ 知道 | ❌ 不知道(只知道名字) |
| 多个应用共享 | ❌ 每个应用独立 | ✅ 共享同一个 |
| 适用场景 | 单机部署 | 多应用共享、企业级部署 |
二、mybatis + spring 项目(推荐)
spring 管理连接池,mybatis 直接引用,最常用、最简洁。
spring + mybatis 配置第三方连接池非常灵活,核心思路是:spring 创建连接池 bean → mybatis 引用这个 bean。
1. 添加 maven 依赖
<dependencies>
<!-- spring 核心 -->
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-context</artifactid>
<version>5.3.29</version>
</dependency>
<!-- spring jdbc(包含事务管理) -->
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-jdbc</artifactid>
<version>5.3.29</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis</artifactid>
<version>3.5.13</version>
</dependency>
<!-- mybatis-spring 整合包 -->
<dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis-spring</artifactid>
<version>2.1.1</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>8.0.33</version>
</dependency>
<!-- 连接池:三选一 -->
<!-- hikaricp(推荐) -->
<dependency>
<groupid>com.zaxxer</groupid>
<artifactid>hikaricp</artifactid>
<version>5.0.1</version>
</dependency>
<!-- 或 druid -->
<dependency>
<groupid>com.alibaba</groupid>
<artifactid>druid</artifactid>
<version>1.2.20</version>
</dependency>
<!-- 或 dbcp(tomcat 自带,无需额外依赖) -->
<!-- 使用 org.apache.commons:commons-dbcp2 -->
</dependencies>2. spring 配置文件applicationcontext.xml
方案 a:hikaricp
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemalocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- ========== 1. 连接池:hikaricp ========== -->
<bean id="datasource" class="com.zaxxer.hikari.hikaridatasource">
<!-- 基本配置 -->
<property name="driverclassname" value="com.mysql.cj.jdbc.driver"/>
<property name="jdbcurl" value="jdbc:mysql://localhost:3306/mydb?usessl=false&servertimezone=asia/shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- 连接池参数 -->
<property name="maximumpoolsize" value="20"/> <!-- 最大连接数 -->
<property name="minimumidle" value="5"/> <!-- 最小空闲连接 -->
<property name="connectiontimeout" value="30000"/> <!-- 连接超时(毫秒) -->
<property name="idletimeout" value="600000"/> <!-- 空闲超时(毫秒) -->
<property name="maxlifetime" value="1800000"/> <!-- 最大生命周期(毫秒) -->
<property name="poolname" value="hikaripool"/> <!-- 连接池名称 -->
</bean>
<!-- ========== 2. sqlsessionfactory ========== -->
<bean id="sqlsessionfactory" class="org.mybatis.spring.sqlsessionfactorybean">
<!-- 引用 datasource -->
<!-- 引用上面的 datasource -->
<property name="datasource" ref="datasource"/>
<!-- mapper xml 文件位置 -->
<property name="mapperlocations" value="classpath:mapper/*.xml"/>
<!-- 可选:mybatis 全局配置文件 -->
<property name="configlocation" value="classpath:mybatis-config.xml"/>
<!-- 可选:实体类别名包 -->
<property name="typealiasespackage" value="com.example.entity"/>
</bean>
<!-- ========== 3. mapper 接口扫描 ========== -->
<bean class="org.mybatis.spring.mapper.mapperscannerconfigurer">
<property name="basepackage" value="com.example.mapper"/>
<property name="sqlsessionfactorybeanname" value="sqlsessionfactory"/>
</bean>
<!-- ========== 4. 事务管理器 ========== -->
<bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
<property name="datasource" ref="datasource"/>
</bean>
<!-- ========== 5. 开启注解事务 ========== -->
<tx:annotation-driven transaction-manager="transactionmanager"/>
</beans>方案 b:druid(带监控)
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemalocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- ========== 1. 连接池:druid ========== -->
<bean id="datasource" class="com.alibaba.druid.pool.druiddatasource" init-method="init" destroy-method="close">
<!-- 基本配置 -->
<property name="driverclassname" value="com.mysql.cj.jdbc.driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb?usessl=false&servertimezone=asia/shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- 连接池参数 -->
<property name="maxactive" value="20"/> <!-- 最大连接数 -->
<property name="minidle" value="5"/> <!-- 最小空闲连接 -->
<property name="maxwait" value="60000"/> <!-- 获取连接最大等待时间(毫秒) -->
<property name="initialsize" value="5"/> <!-- 初始连接数 -->
<!-- druid 特有:监控和防御 -->
<property name="filters" value="stat,wall,slf4j"/> <!-- 监控+防火墙+日志 -->
<property name="validationquery" value="select 1"/>
<property name="testwhileidle" value="true"/>
<property name="testonborrow" value="false"/>
<property name="testonreturn" value="false"/>
<!-- 连接池监控页面配置(需要配置 servlet) -->
<property name="resetenable" value="false"/>
</bean>
<!-- ========== 2. sqlsessionfactory ========== -->
<bean id="sqlsessionfactory" class="org.mybatis.spring.sqlsessionfactorybean">
<property name="datasource" ref="datasource"/>
<property name="mapperlocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- ========== 3. mapper 扫描 ========== -->
<bean class="org.mybatis.spring.mapper.mapperscannerconfigurer">
<property name="basepackage" value="com.example.mapper"/>
</bean>
<!-- ========== 4. 事务管理器 ========== -->
<bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
<property name="datasource" ref="datasource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionmanager"/>
</beans>方案 c:dbcp(tomcat 自带,简单)
<!-- 无需额外 maven 依赖 -->
<bean id="datasource" class="org.apache.commons.dbcp2.basicdatasource" destroy-method="close">
<property name="driverclassname" value="com.mysql.cj.jdbc.driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="maxtotal" value="20"/> <!-- 最大连接数 -->
<property name="maxidle" value="10"/> <!-- 最大空闲连接 -->
<property name="minidle" value="5"/> <!-- 最小空闲连接 -->
<property name="maxwaitmillis" value="10000"/> <!-- 最大等待时间(毫秒) -->
</bean>3. 参数名速查表
| 功能 | hikaricp | druid | dbcp |
|---|---|---|---|
| 驱动类 | driverclassname | driverclassname | driverclassname |
| 数据库url | jdbcurl | url | url |
| 用户名 | username | username | username |
| 密码 | password | password | password |
| 最大连接数 | maximumpoolsize | maxactive | maxtotal |
| 最小空闲连接 | minimumidle | minidle | minidle |
| 初始连接数 | — | initialsize | initialsize |
| 连接超时/等待 | connectiontimeout | maxwait | maxwaitmillis |
| 空闲超时 | idletimeout | — | minevictableidletimemillis |
| 最大生命周期 | maxlifetime | — | — |
| 连接检测sql | — | validationquery | validationquery |
4. java 代码中使用
// 实体类
package com.example.entity;
public class user {
private integer id;
private string name;
// getter/setter...
}
// mapper 接口
package com.example.mapper;
import com.example.entity.user;
import org.apache.ibatis.annotations.select;
public interface usermapper {
@select("select * from user where id = #{id}")
user selectbyid(integer id);
}// service 层
package com.example.service;
import com.example.entity.user;
import com.example.mapper.usermapper;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.service;
import org.springframework.transaction.annotation.transactional;
@service
public class userservice {
@autowired
private usermapper usermapper;
public user getuserbyid(integer id) {
return usermapper.selectbyid(id);
}
@transactional
public void updateuser(user user) {
// 事务自动管理
usermapper.update(user);
}
}// 启动类
package com.example;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
public class main {
public static void main(string[] args) {
// 加载 spring 配置
applicationcontext context = new classpathxmlapplicationcontext("applicationcontext.xml");
// 获取 service
userservice userservice = context.getbean(userservice.class);
// 使用
user user = userservice.getuserbyid(1);
system.out.println(user);
}
}换连接池 = 换 class + 调参数名,mybatis 端完全无感知。
三、三种方式对比总结
| 对比项 | 纯 mybatis 自定义 factory | 纯 mybatis jndi | mybatis + spring |
|---|---|---|---|
| 复杂度 | 中(需写工厂类) | 高(需配 tomcat) | 低(spring 管理) |
| 灵活性 | 一般 | 低(依赖容器) | 高 |
| 连接池管理 | 应用内 | tomcat 容器 | spring 容器 |
| 密码位置 | mybatis-config.xml | context.xml(安全) | applicationcontext.xml |
| 多应用共享 | ❌ | ✅ | ❌(每个 spring 容器独立) |
| 事务管理 | 手动 | 手动 | 注解自动 |
| 推荐度 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 适用场景 | 简单纯 mybatis 项目 | 企业 war 部署 | 现代项目首选 |
四、快速选择指南
┌─────────────────────────────────────────┐
│ 项目类型判断 │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────┐
│ 有 spring 吗? │
└─────────────────────────┘
│ │
是 否
│ │
▼ ▼
┌──────────┐ ┌─────────────────────────┐
│ 直接用 │ │ 需要 war 部署到外部 │
│ spring │ │ tomcat 且多应用共享? │
│ 方式 │ └─────────────────────────┘
└──────────┘ │ │
是 否
│ │
▼ ▼
┌──────────┐ ┌─────────────────┐
│ jndi 方式 │ │ 自定义 datasource│
│ │ │ factory 方式 │
└──────────┘ └─────────────────┘五、生产环境推荐
| 场景 | 推荐方案 |
|---|---|
| 新项目/微服务 | spring + mybatis + hikaricp |
| 需要 sql 监控 | spring + mybatis + druid |
| 传统 war 部署 | jndi + tomcat 统一管理 |
| 老项目维护 | 保持原有方案,逐步迁移到 spring |
6-1、spring boot项目换不同的web容器
一、spring boot 怎么换 web 容器
spring boot 默认内嵌 tomcat,但换起来非常简单,就是排除一个依赖、引入另一个依赖。
1. 换成 jetty
<!-- pom.xml -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
<!-- 排除默认的 tomcat -->
<exclusions>
<exclusion>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-tomcat</artifactid>
</exclusion>
</exclusions>
</dependency>
<!-- 引入 jetty -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-jetty</artifactid>
</dependency>2. 换成 undertow(性能极高)
<!-- 同样排除 tomcat -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
<exclusions>
<exclusion>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-tomcat</artifactid>
</exclusion>
</exclusions>
</dependency>
<!-- 引入 undertow -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-undertow</artifactid>
</dependency>就改这几行 maven 依赖,代码完全不用动,spring boot 自动适配。
二、为什么要换?—— 三种容器对比
| 特性 | tomcat(默认) | jetty | undertow |
|---|---|---|---|
| 出身 | apache 基金会 | eclipse 基金会 | jboss(红帽) |
| 体积 | 中等 | 最轻量 | 轻量 |
| 性能 | 中等 | 中等 | 最高(高并发场景优势明显) |
| 内存占用 | 中等 | 较低 | 最低 |
| 启动速度 | 中等 | 最快 | 快 |
| 并发模型 | 线程池(阻塞io) | 线程池 | 非阻塞io(xnio) |
| 热部署 | 支持 | 支持最好 | 支持 |
| 嵌入式友好 | 好 | 最好 | 好 |
| 企业级生态 | 最成熟 | 较少 | 较少 |
| 典型场景 | 通用、企业级 | 微服务、嵌入式设备 | 高并发、云原生、低内存 |
三、什么场景换什么容器?
场景 1:用 tomcat(默认,不动就行)
企业级应用,求稳
需要丰富的监控和管理工具
团队熟悉,文档多
兼容性好,第三方插件多
场景 2:换成 jetty
微服务架构,追求启动快
嵌入式设备 / 物联网(内存受限)
需要频繁热部署开发
和 eclipse 生态集成
场景 3:换成 undertow(趋势)
高并发、高吞吐(如网关、api服务)
云原生 / k8s 部署(内存省=省钱)
长连接、websocket 场景
追求极致性能
四、回到 jndi —— 换容器后配置会变吗?
会变一点,但核心逻辑不变。
| 容器 | jndi 配置位置 | 说明 |
|---|---|---|
| tomcat | conf/context.xml | 最常用,资料最多 |
| jetty | web-inf/jetty-env.xml | 语法类似 |
| undertow | 通常用 spring 配置代替 | 内嵌模式很少用 jndi |
⚠️ 注意:spring boot 内嵌容器模式下,一般不用 jndi,而是直接用 application.yml 配置数据源:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 123456
type: com.zaxxer.hikari.hikaridatasourcejndi 更多用于 传统 war 包部署到外部 tomcat 的场景。
一句话总结
| 问题 | 答案 |
|---|---|
| 怎么换? | 改 maven 依赖,排除 tomcat,引入 jetty/undertow |
| 为什么要换? | tomcat 求稳、jetty 求轻、undertow 求快 |
| jndi 受影响吗? | 内嵌模式一般不用 jndi,外部部署时各容器配置位置不同 |
到此这篇关于mybatis不同的数据库连接池的配置的文章就介绍到这了,更多相关mybatis数据库连接池配置内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论