今天在做Firebird V3.0.3 x64 版本内存测试,本地PC上,准备开启800个事务(保持不关闭),每个事务做些事,尽量不释放内存。
每次测试当事务数达到100时,就提示Connection pool is full,此时内存才吃到500+MB。
在系统配置里没有一个选项是最大连接数,最后发现是在连接字符串里,有个选项是 MaxPoolSize 。
令 MaxPoolSize = 1000 ,程序敞开跑,最后后台进程用到 5GB多,PC内存不够了。
以下是连接字符串:
1 FbConnectionStringBuilder connBuilder = new FbConnectionStringBuilder(); 2 connBuilder.DataSource = "localhost"; 3 connBuilder.UserID = "sysdba"; 4 connBuilder.Password = "123456"; 5 connBuilder.Database = "x"; 6 connBuilder.Charset = "utf8"; 7 connBuilder.ServerType = FbServerType.Default; 8 connBuilder.Dialect = 3; 9 connBuilder.MaxPoolSize = 1000; 10 connBuilder.Pooling = true; 11 _connStr = connBuilder.ConnectionString;
测试程序:
1 for (int i = 0; i < 800; i++) 2 { 3 var db = DbCtxt.NewDbContext().UseTransaction(true); 4 for (int j = 0; j < 500; j++) 5 { 6 db.Insert("m_user").Column("code", "1234567890") 7 .Column("label", "ABCDEFGHIJ") 8 .Column("pwd", "1234").Column("is_del", false).Execute(); 9 } 10 }
测试结束清理连接池: FirebirdSql.Data.FirebirdClient.FbConnection.ClearAllPools(); 只会清理池子里暂时不用的连接,正在使用的连接会被打标记,等连接使用完关闭时,自动清理掉。
内存占用:
2、如果用32位的版本,内存最多吃到1928MB就不行了,提示“无法从操作系统分配内存” unable to allocate memory from operating system
Note:一个连接connection,最多只能有65000个handler(本文例子 大概就是插入行数),否则就会抛异常: too many open handles to database 。
所以在做测试时,一定不要用using,他会自动把连接释放到连接池,下次再次申请连接时,又会申请到此连接,就会提示太多句柄被申请。