传统的做法是基于 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
,按照连接是自动提交模式还是手动提交模式进行区分,这个设计是为了高效的查询匹配的可用连接。ConMap
和 ConQueue
包含的关键对象有:
ConcurrentHashMap<String, ConQueue> items
:可用的 MySQL 连接容器,key 为当前连接对应的 database 名,value 为 ConQueue
对象,里面包含了两个存储数据库连接的队列ConcurrentLinkedQueue<BackendConnection> autoCommitCons
:自动提交的数据库连接ConcurrentLinkedQueue<BackendConnection> manCommitCons
:手动提交的数据库连接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