高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池。
池(pool)的设计 主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒,设计 人员不得不去考虑这些。
比如数据库连接池(sql pool),是通过TCP来通信的,属于IO类,有 一定的延时,在高并发系统中频繁的创建会严重影响系统性能。
内存( mem )的分配是要涉及锁 ( mutex )的,有锁就会有延时,因此可以在开始申请一大块内存,后面进行分配与释放,来节省锁开 销。
服务器的连接处理不仅仅涉及内存,还涉及到一些属性的赋值,这些是要占用CPU时间的, 如果在一开始就创建大量的连接,就方便以后复用了。
下面我以数据库连接池为例,先定义连 接的结构:
typedef struct tst_sql_s tst_sql_t; struct tst_sql_s{ MYSQL *sql; tst_sql_t *next; tst_sql_t *prev; };
现实开发中,我发现有些喜欢用( free-busi ) 模式来设计池。
struct tst_sql_pool_s { tst_sql_t *free_sql; tst_sql_t *busi_sql; … };
将池中的连接分成两个部分,一部分是空闲的(free),一部分是正在用的(busi),相函数 函数:
tst_sql_t* tst_sql_pool_get( tst_sql_pool_t* pool ) { tst_sql_t *sql; if( !pool ){ return 0; } sql = pool->free_sql; if( !sql ){ return 0; } pool->free_sql = sql->next; sql->next = pool->busi_sql; sql->prev = 0; if( pool->busi_sql ){ pool->busi_sql->prev = sql; } pool->busi_sql = sql; return sql; } int tst_sql_pool_put( tst_sql_pool_t* pool, tst_sql_t* sql ) { if( !pool || !sql ){ return 0; } if( sql->prev ){ sql->prev->next = sql->next; } else{ pool->busi_sql = sql->next; } if( sql->next ){ sql->next->prev = sql->prev; } sql->next = pool->free_sql; pool->free_sql = sql; return 0; }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sql
, 设计
, 高并发
, springmvc 高并发
, next
, pool
, sql服务器
, mybatismysql连接池sql
, 并发sql
prev
java高并发服务器设计、高并发服务器设计、编程中设计并发服务器、配置高并发jdbc连接池、atomikos连接池高并发,以便于您获取更多的相关知识。