mycat连接池       

mycat连接池

传统的做法是基于 Database 的连接池,即一个 MySQL 服务器上有 5 个 Database,则每个 Database 独占最大200 个连接

Mycat 则采用了基于 MySQL 实例的连接池模式,每个 Database 都可以用现有的 1000 个连接中的空闲连接

schema 标签用于定义 MyCat 实例中的逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置,可以使用 schema 标签来划分这些不同的逻辑库

<schema name="USERDB checkSQLschema="false" sqlMaxLimit="100" datanode="dn3,dn4">

       <table name="eg_user" dataNode="dn1,dn2" rule="auto-sharing-long"></table>

</schema>

<schema name="ORDERDB checkSQLschema="false" sqlMaxLimit="100">

<table name="eg_order" dataNode="dn3,dn4" rule="auto-sharing-long"></table>

</schema>

在 MyCat 的连接池里,当前可用的、空闲的 MySQL 连接是放到一个 ConcurrentHashMap 的数据结构里,Key 为当前连接对应的 database 名,另外还有二级分类 ConQueue,按照连接是自动提交模式还是手动提交模式进行区分,这个设计是为了高效的查询匹配的可用连接。ConMapConQueue 包含的关键对象有:

public class ConMap {
    /**
    * key:当前连接对应的 Database,物理库
    * ConQueue:数据库连接队列(按照连接是自动提交模式还是手动提交模式进行区分,这个设计是为了高效的查询匹配的可用连接)
    */
    private final ConcurrentHashMap<String, ConQueue> items = new ConcurrentHashMap<String, ConQueue>();

		public ConQueue getSchemaConQueue(String schema) { 
      ConQueue queue = items.get(schema);
			if (queue == null) {
					ConQueue newQueue = new ConQueue(); queue = items.putIfAbsent(schema, newQueue); return (queue == null) ? newQueue : queue;
			}
			return queue;
		}
}

public class ConQueue {
    private final ConcurrentLinkedQueue<BackendConnection> autoCommitCons = new ConcurrentLinkedQueue<BackendConnection>();
    private final ConcurrentLinkedQueue<BackendConnection> manCommitCons = new ConcurrentLinkedQueue<BackendConnection>();
    private long executeCount;
}

参考

https://www.jianshu.com/p/4656869e0ba3