1. 首页
  2. 主题
  3. Go源码

Hi 大家好,我写了一个go mysql驱动的一个优化-stmt cache

sam6666666 · · 3680 次点击
官方对mysql使用标准三步走: sql="insert into users(age) values(?)"; 正常的操作是 stmt = db.Prepare(sql) stmt.Exec(...) stmt.Close prepare的时候会先从连接池里取一个连接,然后根据sql语句 创建一个stmt。但是对于同一种数据频繁数据的场景来说,一次prepare就可以了,没必要每次都重写创建一次stmt。 因此在mysqlConn的时候维护一个cache,以sql语句为key,对应的stmt为value。 同一个sql语句直接返回stmt。 当DB.Close的时候,会调用每次mysqlConn的Close,此时遍历cache释放stmt(stmt.Close()) ,释放cache。 具体操作看我github提交的源码。
场景需求,对于多协程+多sql语句的情景下你需要自己维护一个stmt表,而我做的是从mysql驱动层,在每一个mysqlConn里面扩展了一个cache,不需要对原来的代码做修改。
#4
更多评论
你是不是对prepare有什么误解 正常操作是不需要prepare的 prepare出的stmt本来就是为了多次使用的啊。
#1
考虑下多个协程操作数据库的场景,另外stmt是跟连接绑定的。
#2

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中