本文主要对PostgreSql在Windows下的连接测试。

测试环境: Win7 x64, PostgreSql 10.1 x64

测试语言: VS2015 C#

因为Pg的数据库连接是开启进程来处理的,不像MySQL一样是线程处理。在Windows下开启进程是比较耗时耗资源,不像Linux开启进程。

所以,我做了个测试:循环开启200个线程分别去连接Pg,开启连接后不主动关闭;并且让线程等待300秒也不去主动关闭,以确认Pg开启的进程数。

测试结果: Pg进程数并不会随着连接数的增加而增加,而是保持一定数量不变。

而后,又修改代码,去掉多线程连接数据库,只用主线程连接,还是开200个连接,结果: Pg进程只增加了1,并保持不变。

注:正常情况下,什么都不做,系统会保持8个常驻进程。

以下是测试截图和测试代码:

 using System;
using System.Threading;
using Pg.Model; namespace PgConnectTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("正在测试连接进程...200个进程");
int proCount = ;
while (proCount <= )
{
Console.WriteLine($"开启第{proCount}个线程连接Postgres...");
ThreadPool.QueueUserWorkItem(state =>
{
var db = new MesDbContext();
db.Users.Add(new User() {Account = "", Passwd = "", Label = "shanghai"});
db.SaveChanges();
Thread.Sleep();
});
proCount++;
Thread.Sleep();
}
}
}
}
 using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace Pg.Model
{
public class Model
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public DateTime CreTime { get; set; } = DateTime.Now;
public long? CreUid { get; set; }
public DateTime? UpdTime { get; set; }
public long? UpdUid { get; set; }
public string Remark { get; set; }
public bool IsDel { get; set; } = false;
} [Table("User")]
public class User : Model
{
//[Index(IsUnique = true)]
public string Account { get; set; }
public string Passwd { get; set; }
public string Label { get; set; }
} }
 using System.Data.Entity;
using System.Data.Entity.Migrations; namespace Pg.Model
{
public class MesDbContext: DbContext
{
public MesDbContext():base("name=mes")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MesDbContext, MigrateConfig>());
} public DbSet<User> Users { get; set; }
} public class MigrateConfig : DbMigrationsConfiguration<MesDbContext>
{
public MigrateConfig()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
} }

========= 2017.11.19 以下===============

又经过推敲,其实跟写的代码有关系,

如果是用framework的线程池 ThreadPool.QueueUserWorkItem(state => { }); ,其实不会连续开启很多线程,差不多我测试的结果是开启7个线程。

如果是换作 Task.Run(() => { }); 任务,那么情况差不多,Pg进程开启的数量也是10几个。

但是,如果是直接 new Thread(() => {}) 方式,那么甚至会开启上百个Pg进程

极端,如果是只使用主线程,那么只会开启一个Pg进程。

最新文章

  1. MapReduce job.setNumReduceTasks(0)思考
  2. 12,SFDC 管理员篇 - 页面配置
  3. Vue+Webpack+Grunt集成
  4. Angular从0到1:function(下)
  5. fail2ban 原理 安装 使用
  6. android Java BASE64编码和解码一:基础
  7. html5移动端制作知识点总结
  8. UVA 10025 (13.08.06)
  9. android 开发 获取各种intent (图片、apk文件、excel、pdf等文件)
  10. ubuntu12.04 server + apache2 + wsgi + django1.6 部署
  11. JavaScript权威指南学习笔记6
  12. UVA10304---(区间DP)
  13. js登录滑动验证,不滑动无法登陆
  14. Linux 下 vim 编辑文件,解决中文乱码,设置Tab键空格数
  15. POJ1236【Tarjan+缩点】
  16. HBase快照
  17. 调用webservice帮助类
  18. 服务监控-zabbix监控指标
  19. CentOS 7 下安装jdk1.8(转)
  20. 微信小程序css画三角形内有文字

热门文章

  1. Visual Studio 2008 SP1键盘F10单步调试超慢解决方法
  2. VS 发布MVC网站缺少视图解决方案
  3. HTML中DOM元素的子节点为空?!firstChild, lastChild, childeNodes[]为空
  4. PTA 7-2 深入虎穴 (30 分)
  5. ArrayList用法详解
  6. 初探 模拟退火算法 POJ2420 HDU1109
  7. PHP内核研究 静态变量
  8. [ActionScript 3.0] AS3 ServerSocket示例(官方示例)
  9. Python3之redis使用
  10. To 高一