近日用PostgreSQL和Npgsql写过程序,由于客户数量有300多个,所以有的就连接不上了。
调整了max_connection为500,问题是解决了,可是内存使用也是猛涨。差了点资料,估计可通过两个方面解决一下问题:
PostgreSQL的连接池,如pgbouncer;
Npgsql连接参数:Pooling、MinPoolSize、MaxPoolSize、ConnectionLifeTime等参数。具体可参考Npgsql的UserManual。
解决方法:
1、在连接字符串中加入Pooling=False;
这样客户端Npgsql不把连接保留在Pool中,每次Close都真真正正的把这个连接关掉,这样PostgreSQL服务器上
相关的postgres.exe进程也被结束,如果并行程度不是非常高,max_connection为100足够了。
这样做完的好处是服务器上postgres.exe进程少了,内存占用也少了。缺点是每次连接服务器都要重新创建
postgres.exe进程,浪费一些CPU资源。根据项目的特点和服务器的配置选择是否要用这个选项,如果内存是瓶颈
2、调整了一下ConnectionLifeTime,好像没什么作用。
3、调用ClearAllPools(); ClearPool();等函数及时清理不用的连接。
4、在Windows平台下的PostgreSQL的一些配套软件pgpool、pgbouncer等目前不能用,如果在Unix等平台上倒是
可以用它们调调性能。
http://www.powerpostgresql.com/PerfList
http://npgsql.projects.postgresql.org/docs/manual/UserManual.html
http://www.revsys.com/writings/postgresql-performance.html