先说结论:你需要一个小连接池,和一个充满了等待连接的线程的队列。
连接池不是越大越好,池的大小表示服务器同时能进行连接数量,但一颗CPU核心同一时刻只能执行一个线程,然后操作系统切换上下文,核心开始执行另一个线程的代码,以此类推。给定一颗CPU核心,其顺序执行A和B永远比通过时间分片“同时”执行A和B要快,这是一条计算机科学的基本法则。一旦线程的数量超过了CPU核心的数量,再增加线程数系统就只会更慢,而不是更快。所以,初步结论:池大小 = CPU核心数。
如果我们将池大小设为CPU核心数,就会出现这么一种情况:线程是在“阻塞”着,等待硬盘。所以,由于线程总是在I/O上阻塞,我们可以让线程(连接数)比CPU核心多一些,这样能够在同样的时间内完成更多的工作。I/O时间越短,需要多出来的线程越少。只有当阻塞创造了更多的执行机会时,更多的线程数才能发挥出更好的性能。网络耗时和I/O是同一个思路。
下面的公式是由PostgreSQL提供的,不过我们认为可以广泛地应用于大多数数据库产品:
连接数 = ((核心数 * 2) + 有效磁盘数)
按这个公式,你的4核i7数据库服务器的连接池大小应该为((4 * 2) + 1) = 9。