C# 连接池开发,多连接高效应用开发,多连接自动维护管理。

本文将使用一个Github开源的组件库技术来实现连接池的操作,应用于一些情况下的频繁的网络连接操作。

github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持,打赏请认准源代码项目。

本项目目前支持C#语言和java语言,C#语言的功能比较齐全,java版本的库还在开发及完善中。

nuget地址:https://www.nuget.org/packages/HslCommunication/           

github地址:https://github.com/dathlin/HslCommunication                                 如果喜欢可以star或是fork,还可以打赏支持。

技术支持QQ群:592132877  (组件的版本更新细节也将第一时间在群里发布)最后编辑日期:2018年6月13日 08:28:34

里面各种小伙伴,为您解答数据交互,编程技巧,如果对本界面提供的API有任何疑问,都可以加群咨询,如果有更好的建议,欢迎提出。

组件的完整信息和API介绍参照:http://www.cnblogs.com/dathlin/p/7703805.html   组件的使用限制,更新日志,都在该页面里面。

为什么需要连接池



首先需要解决这个问题,我们为什么需要连接池,终极目的是是为了高效的数据访问,但并不是所有情况都需要进行连接池搭建的,举几个??吧

案例一:你有个后台线程每隔1s钟在读取PLC的数据,你和PLC的交互都在这个线程里面,那么完全是不需要进行连接池的。

案例二:你会在程序的多个线程(包括线程池里面)进行和PLC进行数据交互,频繁的读写操作,如果共用一个连接的性能达不到要求怎么办(通常在无线网络下,一次数据交互在30ms-100ms之间,网络波动较大)?,如果每次操作都创建连接,操作结束后关闭,这样也可以达到功能,只是损耗性能比较严重,无论是对PLC还是本机,通讯的效率也不是很理想,因为每次操作都是重新连接和关闭,这里的PLC实际上可以替换成数据库,Redis,其他任何的数据通信。

什么时候不能连接池



并不是所有的情况都可以使用连接池的,有个巨大的限制,如果服务器不支持多连接就很麻烦,比如说三菱PLC的服务器的端口,当然,一般的数据库,Redis,特殊的服务器都是支持。当然,有些特殊的服务器,支持的连接数是有上限的,没事,本组件也可以配置上限的连接数。

特性支持



本功能类的设计之初,就是兼顾灵活性,为了支持其他所有的不同类型的数据通信,采用接口+泛型来实现,先构建一个通信封装类,再进行创建一个连接池管理器,再调用使用。

  1. 支持配置最大的连接数
  2. 支持设置连接过期时间
  3. 支持任意的其他类型的连接对象变成连接池

实战示例



此处举例访问西门子的PLC,所以第一步是创建一个连接的封装类,除了实现接口外,还需要定义真实的连接对象。

    public class SiemensConnector : HslCommunication.Algorithms.ConnectPool.IConnector
    {
        #region 构造方法

        public SiemensConnector( string ipAddress )
        {
            siemens = new HslCommunication.Profinet.Siemens.SiemensS7Net( HslCommunication.Profinet.Siemens.SiemensPLCS.S1200, ipAddress );
        }

        #endregion

        #region IConnector 实现

        /// <summary>
        /// 指示当前的连接是否在使用用
        /// </summary>
        public bool IsConnectUsing { get; set; }

        /// <summary>
        /// 唯一的GUID码
        /// </summary>
        public string GuidToken { get; set; }

        /// <summary>
        /// 最新一次使用的时间
        /// </summary>
        public DateTime LastUseTime { get; set; }

        /// <summary>
        /// 打开连接
        /// </summary>
        public void Open( )
        {
            // 设置常连接。如果是Redis,可以连接服务器,数据库也是一样
            siemens.ConnectServer( );
        }

        /// <summary>
        /// 关闭并释放
        /// </summary>
        public void Close( )
        {
            // 关闭连接
            siemens.ConnectClose( );
        }

        #endregion

        #region Public Member

        /// <summary>
        /// 获取当前的连接对象,方便进行数据交互
        /// </summary>
        /// <returns></returns>
        public HslCommunication.Profinet.Siemens.SiemensS7Net GetSiemens( )
        {
            return siemens;
        }

        #endregion

        #region Private Member

        private HslCommunication.Profinet.Siemens.SiemensS7Net siemens;        // 连接对象

        #endregion
    }

定义好之后,就可以创建真正的连接池对象了

private HslCommunication.Algorithms.ConnectPool.ConnectPool<SiemensConnector> siemensConnect = null;           // 西门子对象的连接池

  

然后初始化变量

siemensConnect = new HslCommunication.Algorithms.ConnectPool.ConnectPool<SiemensConnector>( ( ) => { return new SiemensConnector( "192.168.1.195" ); } );
            siemensConnect.MaxConnector = 10;         // 同时存在的最大连接数
            siemensConnect.ConectionExpireTime = 30;  // 连接多久不用就自动回收释放,单位秒

初始化的时候,有个地方需要注意,连接池需要知道一个信息,如何去创建一个新的连接对象,在这里可能创建默认的SiemesConnector就可以类,但是连接池的管理对象很有可能也是个接口,这时候就需要手动指示如何实例化一个新的对象。这种情况我在使用dapper的ORM的时候,支持mysql和sqlserver两种数据的时候就碰到过。

调用连接对象类,以下的代码可以出现在任何的后台线程:

            // 这里的代码在单线程程序情况下,没有什么效果,但是在多线程情况下可以显著提升性能。
            // 举例,此处要访问PLC的一个数据
            SiemensConnector connector = siemensConnect.GetAvailableConnector( );
            short m100 = connector.GetSiemens( ).ReadInt16( "M100" ).Content;

            // 使用完毕后归还连接
            siemensConnect.ReturnConnector( connector );

  

使用完后务必归还连接对象,如果想要获取连接池里已经被激活的连接数

int online = siemensConnect.UsedConnector;

  

还有,在获取连接对象后,进行操作的时候,务必不要抛出异常,

原文地址:https://www.cnblogs.com/dathlin/p/9191211.html

时间: 2024-10-10 11:18:44

C# 连接池开发,多连接高效应用开发,多连接自动维护管理。的相关文章

工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧

原文:工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<工欲善其事,必先利其器.VS2013全攻略(安装,技巧,快捷键,插件)!> 看到很多朋友回复和支持,非常感谢,尤其是一些拍砖的喷油,感谢你们的批评,受益良多. 我第一份工作便是WPF的开发,一直到现在都非常喜欢这门技术,从懵懵懂懂到现在有一些WPF开发资历,也算是经历了一段坎坷的过程.我的朋友看到我写了VS2013的全攻略,他就推荐我写一个WPF篇,我想了下,的确很多朋友初接触WPF的时候难免会

JAVAWEB开发之事务详解(mysql与JDBC下使用方法、事务的特性、锁机制)和连接池的详细使用(dbcp以d3p0)

事务简介 事务的概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功 在开发中,有事务的存在,可以保证数据的完整性. 注意:数据库默认事务是自动提交的,也就是发一条SQL 就执行一条.如果想多条SQL语句放在一个事务中执行,需要添加事务有关的语句. 如何开启事务? 事务的操作方式: 创建表: create table account( id int primary key auto_increment, name varchar(20), money double

java商城开发中的连接池的配置

在对java商城开发以及jsp商城的开发中,连接池的使用以及配置更为重要,为什么会如此说了,下面我们的开发人员就来带大家深入的了解一下java开发过程中的连接池. 数据库每个读写操作需要一个连接,而它的访问流程大概如下: 应用数据层向DataSource请求数据库连接 DataSource使用数据库Driver打开数据库连接 创建数据库连接,打开TCP socket 应用读/写数据库 如果该连接不再需要就关闭连接 关闭socket 容易推断出打开/关闭数据库连接是开销很大的操作.PostgreS

golang开发:类库篇(二) Redis连接池的使用

为什么要使用连接池 一个数据库服务器只拥有有限的连接资源,一旦所有的连接资源都在使用,那么其它需要连接的资源就只能等待释放连接资源.所以,在连接资源有限的情况下,提高单位时间的连接的使用效率,缩短连接时间,就能显著缩短请求时间. 所以就有了连接池的概念,在初始化时,创建一定数量的连接,先把所有连接存起来,然后,谁需要使用,从这里取走,干完活立马放回来. 如果请求数超出连接池容量,那么就排队等待或者直接丢弃掉.这样就可以省掉每次都创建和关闭连接的资源消耗和时间. 如果不使用连接池,那么,每次传输数

Ti:关于DB连接池

1.连接池的概念 网络编程中提出了将Socket放入池中,让多个线程共享这些插座(Socket)对应的线缆(Conenction),DB连接池就是基于连接池的一个实现. ①连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用. @百度百科 ②数据库连接池这一解决方案是指在应用程序启动时,建立足够的数据库连接,并将这些连接组成一个连接池,由应用程序动态的对池中的连接进行申请/使用/释放. 而对于多于连接池中连接数的并发请求,应在请求队列中排队等待连接的释放. 应用程序可

连接池(转载)

1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开发模式逐渐取代C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍采用的技术.在Web应用开发的早期,主要使用的技术是CGI﹑ASP﹑PHP等.之后,Sun公司推出了基于Java语言的Servlet+Jsp+JavaBean技术.相比传统的开发技术,它具有跨平台

在Tomcat中配置连接池和数据源

1.DataSource接口介绍 (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制. 一个DataSource对象代表了一个真正的数据源.根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件.当一个DataSource对象注册到名字服务中(JNDI),应用程序就可以通过名字服务获得DataS

连接池的基本工作原理

1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式正是为了解决资源的频繁分配?释放所造成的问题.为解决上述问题,可以采用数据库连接池技术.数据库连接池的基本思想就是为数据库连接 建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定 连接池最大连接数来防止系统无尽的与数据库连接.更

Tomcat 【中配置连接池和数据源】

四.Tomcat 中配置连接池和数据源   1.DataSource接口介绍   (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制. 一个DataSource对象代表了一个真正的数据源.根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件.当一个DataSource对象注册到名字服务中(JN