Apache main函数执行流程

本文详细解析了Apache服务器从启动到主循环的过程,包括进程初始化、配置加载、参数处理及配置树处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变量:

process_rec,a structure that represents one process。

 

struct process_rec { apr_pool_t *pool; //全局池 apr_pool_t *pconf; //配置池 int argc; //参数个数 const char * const *argv; //参数 const char *short_name; };//表示进程的数据结构

 

apr_pool_t:基本池类型

 

1: AP_MONCONTROL(0); 代码剖析控制

 

2: process = init_process(&argc, &argc); //进程初始化,process代表主进程信息。

 

3: apr_pool_create(&pcommands, pglobal);

      apr_pool_tag(pcommands, "pcommands");

      pcommands --> 命令行参数池

 

4: error = ap_setup_prelinked_modules(process); //将所有预连接的模块加入到加载模块链表中。

 

5: ap_run_rewrite_args(process);

rewrite_args是为MPM模块设置的,允许MPM模块对命令行中的传入参数进行重写。

 

6: 参数处理

apr_getopt_t *opt;

apr_getopt_init(&opt, pcommands, process->argc, process->argv);

处理参数传入opt。

while((rv=apr_getopt(opt, AP_SERVER_BASEARGS, &c, &optarg)) == APR_SUCCESS) {

char **new;

switch(c) {

case 'c':

}

}

 

7: apr_pool_create(&plog, pglobal);

apr_pool_tag(plog, "plog");

内存池,内存池树

 

8: ap_replace_stderr_log(process->pool, temp_error_log);

输出日志文件替换。

 

9: 读取配置

server_conf = ap_read_config(process, ptemp, confname, &ap_conftree);

解析成配置树。

 

10: ap_run_pre_config(pconf, plog, ptemp);

触发模块的pre_config挂钩,是模块可以修改配置树。

 

11: ap_process_config_tree

处理配置树。

 

12: signal_server = APR_RETRIEVE_OPTIONAL_FN(ap_signal_server);

ap_run_post_config(pconf, plog, ptemp, server_conf);

 

13: for(;;) 主循环

请求处理被分割为多个挂钩阶段,每个阶段实现一个特定的任务,开发人员注册挂钩。Apache会自动执行所有挂钩函数。

 

 

<think>好的,我需要帮助用户理解如何在MyBatis中使用main函数进行初始化配置。用户已经看过一些示例,但需要更具体的指导。首先,我应该回忆MyBatis的基本初始化流程。通常,MyBatis的初始化包括加载配置文件、创建SqlSessionFactory,然后通过它生成SqlSession。用户可能想通过main函数手动完成这些步骤,而不是依赖框架如Spring Boot。 接下来,我需要考虑如何将这些步骤转化为Java代码。首先,用户需要配置mybatis-config.xml,这个文件包含了数据库连接信息和映射器配置。然后,在main函数中,使用Resources.getResourceAsStream来加载这个配置文件,并构建SqlSessionFactory。之后,打开一个SqlSession,用它来获取映射器接口的实例,进而执行SQL操作。 用户可能还会关心如何处理异常,比如IOException,所以代码中应该包含try-catch块。此外,示例中应该展示基本的CRUD操作,比如查询用户,这样用户能更直观地理解流程。需要确保代码的每一步都有注释,解释其作用,比如初始化配置、创建会话、获取映射器等。 同时,用户提供的引用内容提到了使用映射器执行语句的流程,所以在示例中要突出这一部分。可能还需要提到关闭SqlSession的重要性,以避免资源泄漏。另外,如果用户有数据库初始化的SQL语句,像他们提到的mall数据库和users表,示例中的映射器应该对应这个结构,确保代码能够直接运行。 最后,生成的相关问题需要考虑用户可能进一步的需求,比如配置文件的详细参数、如何结合Spring Boot,或者在Web应用中的初始化方式。这些问题可以帮助用户深入学习和应用MyBatis的不同场景。</think>### MyBatis使用main函数初始化配置示例 在MyBatis中通过`main`函数手动初始化配置的核心流程分为以下步骤: 1. **配置XML文件** 在`resources`目录下创建`mybatis-config.xml`,包含数据库连接池、事务管理和映射器注册: ```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="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mall"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration> ``` 2. **Java代码初始化** 通过`SqlSessionFactoryBuilder`加载配置并创建会话: ```java import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisDemo { public static void main(String[] args) { try { // 1. 加载配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 2. 创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 3. 打开SqlSession(自动提交事务) try (SqlSession session = sqlSessionFactory.openSession(true)) { // 4. 获取映射器接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); // 5. 执行数据库操作 User user = userMapper.selectUserById(1); System.out.println("查询结果:" + user.getName()); } } catch (IOException e) { e.printStackTrace(); } } } ``` 3. **映射器与SQL定义** 创建接口`UserMapper.java`和对应的XML文件`UserMapper.xml`: ```xml <!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="com.example.entity.User"> SELECT * FROM users WHERE id = #{id} </select> </mapper> ``` #### 关键点说明 - **手动控制事务**:若未设置`openSession(true)`,需手动调用`session.commit()`提交事务 - **资源释放**:使用`try-with-resources`语法自动关闭`SqlSession`,避免连接泄漏[^1] - **映射器绑定**:XML文件中`namespace`必须与接口全限定名严格对应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值