多线程手动创建数据库连接池 减少sql Server的CPU和内存占用
类型:服务器面积大小:528.6M语言:多语言[中文]评分:10.0标签:立即下载改进前分析:
由于之前的项目占用了太多的sqlserver,程序运行时,sqlserver占用了60%左右的CPU和1.6G左右的内存,可能导致服务器宕机或者其他软件无法正常运行。而且程序本身并不会占用太多的CPU和内存。因此,为了减少sqlserver的占用,采用了两种解决方案:数据库连接池和数据缓冲池。
因为是在多线程环境下,所以需要保证数据同步。但是我没有深入学习EF,只好自己写。
对数据库连接池的思考:
1.当前软件中必须只有一个数据库连接池,所以使用singleton模式来定义它。
2.为了便于调用,方法由静态定义。
4.调用DBConnPool(数据库连接池)时,必须确保已经初始化了必要的字段,而且这个类是静态类,所以使用静态构造方法,在静态构造方法中初始化必要的变量。
3.数据库连接必须存储在一个字段中,并且这个字段随时增长(当它小于最大连接数时),所以我使用ListSqlconnection。
4.一个连接只能由一个代码同时调用,因此必须通过属性来区分。因此,它封装了自己的MySQL Connect,其中包含两个字段:sqlconnection和bool IsUsed。当前连接使用时,IsUsed=true,使用时,IsUsed=false;另外,一般在DBHelper中,我们习惯于使用来包含sqlconnection以达到手动释放的效果。这里有两个解决方案:
4.1:mysqlcon实现IDsipose接口,将IsUsed设置为false处置中;
4.2:使用不适用。sqlconnection Isused up之后,Isused调用MySqlconn被设置为false。我用这种方法。但理论上两者都是可能的。
5.该程序不使用事务处理,因此没有设置。这个想法只适用于当前项目。
总结:数据库连接池的整个过程是
1.调用DBConnPool(数据库连接池)来获取数据库连接。
2.如果这是第一次调用,首先调用DBConnPool的静态构造函数来初始化类。
3.获取数据库连接
3.1.锁定(线程之间的同步)
3.2.获取一个带有假myknn的myknn对象。我使用了列表中的属性。如果不是,则返回空值
3.2.确定返回的MyConn对象是否为空。如果为空,则确定列表是否为空。计数大于最大数据库连接数。如果更大,睡眠线程并再次获得它。如果它较少,创建一个新的MyConn对象,并将其放入列表集合中。
3.3.将MyConn对象的IsUsed设置为true。
3.4、解锁
3.5.返回我的网络对象
4.使用myknn对象后,设置myknn。我被设为false。
粘贴部分代码:
1 publicstaticmysqlcongetconn()2 { 3 mysqlconconn=null;45 lock(sync get)6 { 7if(ListMySQL Conn==null)8 { 9 ListMySQL Conn=NewListMySQL Conn();10}11if(listMySqlConn。count 0)12 { 13 conn=GetConnFromCollECTion();1415 while(conn==null)16 { 17if(ListMySQL Conn。Count=maxNum)18{19System。线程。线程。睡眠(200);20 conn=GetConnFromCollECTion();21 } 22else 23 { 24c onn=NewMySQL Conn(ListMySQL Conn。Count,NewsqlConnection(connstr));25listMySqlConn。add(conn);26 } 27 } 28 } 29 else 30 { 31 con n=NewMySQL Conn(ListMySQL Conn。Count,NewsqlConnection(connstr));32listMySqlConn。add(conn);33 } 34孔。IsUsed=true35if(conn.Sqlconn.State!=ConnectionState。打开)36{37conn。sqlconn . Open();38 } 39 } 40returnconn41 } 4243 privatestatickmysqlcongetconfromccollection()44 { 45mysqlconconn=null;46 foreach(MySQLConItemInlistMySqlConn)47 { 48if(!项目。IsUsed)49 { 50 conn=item;51break52 } 53 } 54returnconn55}
下次在多线程环境中写入数据缓冲池
版权声明:多线程手动创建数据库连接池 减少sql Server的CPU和内存占用是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。