c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)
数据库连接池是在应用程序启动时创建一定数量的数据库连接,并将这些连接存储在池中。当应用程序需要与数据库通信时,它可以向池中请求一个连接,使用完后将连接归还给池,而不是关闭连接。这样可以减少创建和关闭连接的开销,提高应用程序的性能。
一、Apache-DbUtils工具类
Apache DbUtils 是一个简化 JDBC 编程的开源工具类库,它封装了 JDBC API 中的许多重复性任务,如结果集的处理、连接的管理等。DbUtils 提供了几个核心类和接口,帮助开发者更高效地编写数据库访问代码。
1.安装commons-dbutils-1.3.jar
下载官网:DbUtils – Download Apache Commons DbUtils
下载后将jar文件复制粘贴到idea的lib目录

在IDEA中,右击jar包,选择“Add as Library”将其添加到项目库中
2.核心类与接口
| 类/接口 | 作用 |
|---|---|
| QueryRunner | QueryRunner 是 DbUtils 中最常用的类之一,它简化了执行 SQL 查询和更新的过程。QueryRunner 使用 DataSource 来获取数据库连接,并在执行完操作后自动关闭连接。 |
| ResultSetHandler | ResultSetHandler 是一个接口,用于将 ResultSet 转换为其他对象。DbUtils 提供了多个实现类,如 BeanHandler、BeanListHandler、ColumnListHandler、ScalarHandler 等。 |
| DbUtils | 工具类,提供静默关闭连接、提交事务等辅助方法 |
| BasicRowProcessor | BasicRowProcessor 是一个用于处理 ResultSet 的类,它负责将 ResultSet 中的数据映射到 Java 对象。BasicRowProcessor 可以与 ResultSetHandler 一起使用。 |
二、c3p0的配置与运用
C3P0是一个开源的JDBC连接池,它实现了数据源和连接池的管理。C3P0提供了很多功能,比如连接测试、自动回收空闲连接、支持多种数据库等等。
下载官网:c3p0:JDBC DataSources/Resource Pools download | SourceForge.net

解压下载的压缩包,所需的jar包位于解压后的lib目录下,主要包括:
c3p0-0.9.5.5.jarc3p0-oracle-thin-extras-0.9.5.5.jarmchange-commons-java-0.2.19.jar
-
添加jar包到IDEA项目:
- 将下载并解压后的jar包文件(如
c3p0-0.9.5.5.jar和mchange-commons-java-0.2.19.jar)复制到项目的lib目录下。 - 在IDEA中,右击这些jar包,选择“Add as Library”将其添加到项目库中
- 将下载并解压后的jar包文件(如

2.创建和配置c3p0-config.xml文件:
- 在项目的
src目录下新建一个名为c3p0-config.xml的文件,配置数据库连接池的相关参数。例如:
<c3p0-config><named-config name="my">
<!-- 驱动类 --><property name="driverClass">com.mysql.cj.jdbc.Driver</property><!-- url--><property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydb</property><!-- 用户名 --><property name="user">root</property><!-- 密码 --><property name="password">root</property><!-- 每次增长的连接数--><property name="acquireIncrement">5</property><!-- 初始的连接数 --><property name="initialPoolSize">10</property><!-- 最小连接数 --><property name="minPoolSize">5</property><!-- 最大连接数 --><property name="maxPoolSize">10</property><!-- 可连接的最多的命令对象数 --><property name="maxStatements">5</property> <!-- 每个连接对象可连接的最多的命令对象数 --><property name="maxStatementsPerConnection">2</property></named-config>
</c3p0-config>
注意:
(1).我用的mysql是8.0版本所以类名是com.mysql.cj.jdbc.Driver
(2).文件名不要写错了,尽量fic3p0-config.xml
3.使用c3p0连接池+Apache-DbUtils工具类:
例如:c3p0连接池连接MySQL+Apache-DbUtils的QueryRunner类,查询数据
import DAO_.Bean.Student; // 引入Student类
import com.mchange.v2.c3p0.ComboPooledDataSource; // 引入连接池类
import org.apache.commons.dbutils.QueryRunner; // 引入查询运行器类
import org.apache.commons.dbutils.handlers.BeanListHandler; // 引入结果集处理类
import java.beans.PropertyVetoException; // 引入属性否定异常
import java.io.FileInputStream; // 引入文件输入流
import java.io.FileNotFoundException; // 引入文件未找到异常
import java.io.IOException; // 引入IO异常
import java.sql.Connection; // 引入数据库连接接口
import java.sql.SQLException; // 引入SQL异常
import java.util.List; // 引入列表接口
import java.util.Properties; // 引入属性类public class A {public static void main(String[] args) {// 加载配置文件Properties properties = new Properties();try (FileInputStream fis = new FileInputStream("src/mysql.properties")) {properties.load(fis);} catch (FileNotFoundException e) {System.err.println("配置文件未找到!");return;} catch (IOException e) {System.err.println("读取配置文件失败!");return;}// 从配置文件中获取数据库连接信息String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");// 创建数据库连接池ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();try {comboPooledDataSource.setPassword(password);comboPooledDataSource.setUser(user);comboPooledDataSource.setJdbcUrl(url);comboPooledDataSource.setDriverClass(driver);comboPooledDataSource.setInitialPoolSize(50);comboPooledDataSource.setMaxPoolSize(100);} catch (PropertyVetoException e) {System.err.println("设置数据库连接池参数失败!");return;}// 从连接池中获取数据库连接try (Connection connection = comboPooledDataSource.getConnection()) {// SQL查询语句String sql = "select * from t2;";// 创建查询运行器QueryRunner queryRunner = new QueryRunner();// 执行查询,并将结果集转换为Student对象的列表List<Student> students = queryRunner.query(connection, sql, new BeanListHandler<>(Student.class));// 遍历并打印学生信息for (Student student : students) {System.out.println(student);}//关闭连接connection.close();} catch (SQLException e) {System.err.println("数据库操作失败!");}}
}
查询结果:

三、Druid连接池的配置与运用
Druid是阿里巴巴开源的数据库连接池,不仅提供连接池管理,还包含强大的监控和扩展能力,性能优秀,尤其适用于高并发场景。
1.安装druid-1.1.10.jar
下载地址:Central Repository: com/alibaba/druid/1.2.23 (maven.org)
和以上连接池一样操作,这里就不演示了
2.创建和配置druid.properties文件:
#key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?rewriteBatchedStatements=true
#url=jdbc:mysql://localhost:3306/mydb
username=root
password=root
#initial connection Size
initialSize=10
#min idle connecton size
minIdle=5
#max active connection size
maxActive=20
#max wait time (5000 mil seconds)
maxWait=5000
![]()
3.使用Druid连接池+Apache-DbUtils工具类:
例如:Druid连接池连接MySQL+Apache-DbUtils的QueryRunner类,查询数据
import DAO_.Bean.Student; // 引入Student类
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner; // 引入查询运行器类
import org.apache.commons.dbutils.handlers.BeanListHandler; // 引入结果集处理类
import javax.sql.DataSource;
import java.io.FileInputStream; // 引入文件输入流
import java.io.FileNotFoundException; // 引入文件未找到异常
import java.io.IOException; // 引入IO异常
import java.sql.Connection; // 引入数据库连接接口
import java.sql.SQLException; // 引入SQL异常
import java.util.List; // 引入列表接口
import java.util.Properties; // 引入属性类public class Test{public static void main(String[] args) {// 加载配置文件Properties properties = new Properties();try (FileInputStream fis = new FileInputStream("src/druid.properties")) {properties.load(fis);} catch (FileNotFoundException e) {System.err.println("配置文件未找到!");return;} catch (IOException e) {System.err.println("读取配置文件失败!");return;}Connection connection;// 创建数据库连接池try {DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);connection = dataSource.getConnection();} catch (Exception e) {throw new RuntimeException(e);}// 从连接池中获取数据库连接try {// SQL查询语句String sql = "select * from t2;";// 创建查询运行器QueryRunner queryRunner = new QueryRunner();// 执行查询,并将结果集转换为Student对象的列表List<Student> students = queryRunner.query(connection, sql, new BeanListHandler<>(Student.class));// 遍历并打印学生信息for (Student student : students) {System.out.println(student);}//关闭连接connection.close();} catch (SQLException e) {System.err.println("数据库操作失败!");}}
}
查询结果:

补充:Druid连接池的二次封装-->DruidUtil
package DAO_.Utils;import com.alibaba.druid.pool.DruidDataSourceFactory; // 导入Druid数据源工厂类
import javax.sql.DataSource; // 导入数据源接口
import java.io.FileInputStream; // 导入文件输入流类
import java.sql.Connection; // 导入数据库连接接口
import java.sql.ResultSet; // 导入结果集接口
import java.sql.SQLException; // 导入SQL异常类
import java.sql.Statement; // 导入SQL语句接口
import java.util.Properties; // 导入属性类public class DruidUtil {private static DataSource dataSource; // 定义数据源对象,用于获取数据库连接static {Properties properties = new Properties(); // 创建属性对象,用于加载配置文件try {properties.load(new FileInputStream("src\\druid.properties")); // 加载配置文件dataSource = DruidDataSourceFactory.createDataSource(properties); // 根据配置文件创建数据源} catch (Exception e) {throw new RuntimeException(e); // 如果出现异常,抛出运行时异常}}/*** 获取数据库连接** @return 数据库连接对象* @throws SQLException 如果获取连接失败,抛出SQL异常*/public static Connection getconnection() throws SQLException {return dataSource.getConnection(); // 从数据源获取数据库连接}/*** 关闭数据库资源** @param resultSet 结果集对象* @param connection 数据库连接对象* @param statement SQL语句对象*/public static void close(ResultSet resultSet, Connection connection, Statement statement) {try {if (resultSet != null) {resultSet.close(); // 如果结果集对象不为空,则关闭结果集}if (connection != null) {connection.close(); // 如果连接对象不为空,则关闭连接}if (statement != null) {statement.close(); // 如果语句对象不为空,则关闭语句}} catch (SQLException e) {throw new RuntimeException(e); // 如果关闭过程中出现异常,抛出运行时异常}}
}
封装好的方法可以直接调用连接和关闭
例如:
@Test
// 使用BeanListHandler来处理查询结果,将每行数据转换为Student对象,并存储在ArrayList集合中返回
public void test() throws SQLException {Connection connection = DruidUtil.getconnection(); // 获取数据库连接String sql = "select * from t2 where id =?"; // 定义SQL查询语句,参数占位符为?QueryRunner queryRunner = new QueryRunner(); // 创建QueryRunner对象,用于执行SQL语句// 执行查询操作,将结果集转换为List<Student>对象// 参数说明:connection - 数据库连接对象;sql - SQL查询语句;new BeanListHandler<Student>(Student.class) - 结果集处理方式,将每行数据转换为Student对象;1 - SQL语句中的参数值,对应占位符?List<Student> students = queryRunner.query(connection, sql, new BeanListHandler<Student>(Student.class), 1);// 遍历List集合,打印每个Student对象for (Student student : students) {System.out.println(student);}// 关闭数据库连接,释放资源// 参数说明:null - 结果集对象,此处为null because no ResultSet is used;connection - 数据库连接对象;null - SQL语句对象,此处为null because no Statement is explicitly createdDruidUtil.close(null, connection, null);
}
四、C3P0与Druid的比较
-
性能:
- Druid在高并发环境下性能优于C3P0。
-
扩展性:
- Druid支持过滤器机制,易于扩展功能,如SQL日志记录、权限控制等。
- C3P0的扩展性不如Druid。
-
配置复杂度:
- C3P0配置相对简单,易于上手。
- Druid配置较为复杂,学习曲线较陡。
比较的代码:
测试c3p0连接MySQL50万次:
@Test
// 测试使用c3p0连接池获取数据库连接public void TestPool() throws IOException, PropertyVetoException, SQLException {Properties properties = new Properties();// 加载配置文件properties.load(new FileInputStream("src\\mysql.properties"));// 从配置文件中获取数据库连接信息String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");String url = properties.getProperty("url");// 创建c3p0连接池数据源实例ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();// 设置数据库连接驱动comboPooledDataSource.setDriverClass(driver);// 设置数据库用户名comboPooledDataSource.setUser(user);// 设置数据库URLcomboPooledDataSource.setJdbcUrl(url);// 设置数据库密码comboPooledDataSource.setPassword(password);// 设置连接池的初始大小comboPooledDataSource.setInitialPoolSize(50);// 设置连接池的最大大小comboPooledDataSource.setMaxPoolSize(100);// 记录开始时间long l = System.currentTimeMillis();// 循环获取和释放连接,测试连接池性能for (int i = 0; i < 500000; i++) {Connection connection = comboPooledDataSource.getConnection(user, password);connection.close();}// 记录结束时间long l1 = System.currentTimeMillis();// 打印连接池获取连接所需的总时间System.out.println("连接的时间:"+(l1-l));}
结果:
测试druid连接MySQL50万次:
@Test
// 测试使用druid连接池获取数据库连接public void testDruid() throws Exception {Properties properties = new Properties();// 加载druid连接池配置文件properties.load(new FileInputStream("src\\druid.properties"));// 使用DruidDataSourceFactory创建数据源实例DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);// 记录开始时间long l = System.currentTimeMillis();// 循环获取和释放连接,测试连接池性能for (int i = 0; i < 500000; i++) {Connection connection = dataSource.getConnection();connection.close();}// 记录结束时间long l1 = System.currentTimeMillis();// 打印连接池获取连接所需的总时间System.out.println("时间是:"+(l1-l));}
结果:

相关文章:
c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)
数据库连接池是在应用程序启动时创建一定数量的数据库连接,并将这些连接存储在池中。当应用程序需要与数据库通信时,它可以向池中请求一个连接,使用完后将连接归还给池,而不是关闭连接。这样可以减少创建和关闭连接的开销…...
鸿蒙开发深入浅出03(封装通用LazyForEach实现懒加载)
鸿蒙开发深入浅出03(封装通用LazyForEach实现懒加载) 1、效果展示2、ets/models/BasicDataSource.ets3、ets/models/HomeData.ets4、ets/api/home.ets5、ets/pages/Home.ets6、ets/views/Home/SwiperLayout.ets7、后端代码 1、效果展示 2、ets/models/Ba…...
AWS - Redshift - 外部表读取 Parquet 文件中 timestamp 类型的数据
问题: 通过 Redshift Spectrum 功能可以读取 S3 中的文件,当读取 Parquet 文件时,如果列格式设置为 timestamp, 通过 psql 客户端读取会出现以下错误: testdb# select * from myspectrum_schema_0219.test_ns; ERROR…...
Ubuntu20.04之VNC的安装使用与常见问题
Ubuntu20.04之VNC的安装与使用 安装图形桌面选择安装gnome桌面选择安装xface桌面 VNC-Server安装配置开机自启 VNC Clientroot用户无法登入问题临时方案永久方案 安装图形桌面 Ubuntu20.04主流的图形桌面有gnome和xface两种,两种桌面的安装方式我都会写,…...
vue3学习3-route
创建路由器: 应用路由器: 路由展示区RouterView 和 路由跳转RouterLink: 路由组件(在路由配置文件中配置的)一般放到pages/views文件夹下 路由组件切换的时候执行的是 挂载/卸载操作 onMounted / onUnmouted 路由器两…...
C++:dfs,bfs各两则
1.木棒 167. 木棒 - AcWing题库 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过 5050 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。 请你设计一个程序…...
RK Android11 WiFi模组 AIC8800 驱动移植流程
RK Android WiFi模组 AIC8800 驱动移植流程 作者:Witheart更新时间:20250220 概要:本文介绍了基于 AIC8800D40 芯片的 WiFi6 模组 BL-M8800DS2-40 在 RK3568 平台上的驱动移植流程。主要涉及环境搭建、驱动代码分析、设备树修改、驱动编译配…...
深度学习-6.用于计算机视觉的深度学习
Deep Learning - Lecture 6 Deep Learning for Computer Vision 简介深度学习在计算机视觉领域的发展时间线 语义分割语义分割系统的类型上采样层语义分割的 SegNet 架构软件中的SegNet 架构数据标注 目标检测与识别目标检测与识别问题两阶段和一阶段目标检测与识别两阶段检测器…...
免费送源码:ava+springboot+MySQL 基于springboot 宠物医院管理系统的设计与实现 计算机毕业设计原创定制
摘 要 在当今社会,宠物已经成为人们生活中不可或缺的一部分,因此宠物健康和医疗问题也备受关注。为了更好地管理宠物医院的日常运营和提供优质的医疗服务,本研究设计并实现了一套基于Spring Boot框架的宠物医院管理系统。这一系统集成了多项功…...
【电机控制器】ESP32-C3语言模型——DeepSeek
【电机控制器】ESP32-C3语言模型——DeepSeek 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具: 提示:以下是本篇文章正文内容,下面案例可供参考 一、简介 二、代码 #include <Arduino.h&g…...
小型字符级语言模型的改进方向和策略
小型字符级语言模型的改进方向和策略 一、回顾小型字符级语言模型的处理流程 前文我们已经从零开始构建了一个小型字符级语言模型,那么如何改进和完善我们的模型呢?有哪些改进的方向?我们先回顾一下模型的流程: 图1 小型字符级语言模型的处理流程 (1)核心模块交互过程:…...
力扣-贪心-56 合并区间
思路 先按照左区间进行排序,然后初始化left和right,重叠时,更新right,不重叠时,收集区间 代码 class Solution { public:static bool cmp(vector<int> a, vector<int> b){if(a[0] b[0]){return a[1] &…...
vue 3D 翻页效果
<template><view class"swipe-container" touchstart"onTouchStart" touchmove"onTouchMove" touchend"onTouchEnd"><view class"page">初始页</view></view> </template><script&g…...
【系列专栏】银行信息系统研发外包风险管控-08
银行信息系统研发外包风险管控 在金融科技日新月异的当下,银行业务对信息系统的依赖程度与日俱增。为了充分利用外部专业资源,提升研发效率并合理控制成本,许多银行选择将信息系统研发外包。然而,这一策略在带来诸多便利的同时&a…...
[ComfyUI] 【AI】如何获得一张人物图片的优质描述
在使用ComfyUI时,获取一张人物图片的优质英文描述非常重要,尤其是在涉及图像生成、自动化标签和多模态AI任务时。以下是一个简单的流程,可以帮助你快速从一张人物图片中提取出精确且高质量的英文描述。 1. 打开 Hugging Face 网站 首先,您需要访问 Hugging Face 提供的 J…...
深度学习基础--ResNet网络的讲解,ResNet50的复现(pytorch)以及用复现的ResNet50做鸟类图像分类
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 如果说最经典的神经网络,ResNet肯定是一个,这篇文章是本人学习ResNet的学习笔记,并且用pytorch复现了ResNet50&…...
stack,queue,priority_queue学习知识点
容器适配器 在c常用的容器中,有的是以容器迭代器为核心,而有的则以容器适配器为核心。较为常用的就包括queue和stack。接下来我将简单的以queue和stack的模拟实现介绍其特点。 在以下的模拟实现中,class Con就是我们的容器适配器࿰…...
css特异性,继承性
html <div class"introduce"><div class"title">介绍</div><div class"card-box"><div class"card"><div class"title">管理</div></div></div> </div> scs…...
力扣hot100刷题——11~20
文章目录 11.滑动窗口最大值题目描述思路:滑动窗口单调队列code 12.最小覆盖子串题目描述思路:双指针/滑动窗口哈希code Ⅰcode Ⅱ 13.最大子数组和题目描述思路:dp/贪心code 14.合并区间题目描述思路:贪心code 15.轮转数组题目描…...
R语言Stan贝叶斯空间条件自回归CAR模型分析死亡率多维度数据可视化
全文链接:https://tecdat.cn/?p40424 在空间数据分析领域,准确的模型和有效的工具对于研究人员至关重要。本文为区域数据的贝叶斯模型分析提供了一套完整的工作流程,基于Stan这一先进的贝叶斯建模平台构建,帮助客户为空间分析带来…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
