基于.NET的数据库访问技术的优化研究.doc

上传人:知****量 文档编号:43070053 上传时间:2022-09-16 格式:DOC 页数:15 大小:71KB
返回 下载 相关 举报
基于.NET的数据库访问技术的优化研究.doc_第1页
第1页 / 共15页
基于.NET的数据库访问技术的优化研究.doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《基于.NET的数据库访问技术的优化研究.doc》由会员分享,可在线阅读,更多相关《基于.NET的数据库访问技术的优化研究.doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、基于.Net的数据库访问技术的优化研究伍锐锋 主页:.ken-wu.(2005级 信息管理与信息系统)摘要:随着计算机和因特网的飞速发展,数据库访问技术也变得越来越丰富。随着分布式数据库技术的发展与XML WEB服务的普与,人们对断开式数据库访问技术与分层数据(特别是XML文档)处理能力的要求也越来越高。.NET作为为一个被广泛接受的开发与应用平台,其平台上的数据库访问技术也就自然成了一个重要的研究课题。现今关于.NET平台的研究文章越来越多,这们都有各自的特点和适用围,但是在结构和应用上各有偏重,本文则尝试从数据库访问技术优化的角度对基于.NET平台的数据库访问技术进行研究,总结出基于.NE

2、T平台的数据库优化技术,以有助于.NET平台下广大开发与研究人员的学习与工作。关键词:.NET;数据库访问技术;ADO.NET;数据库优化; Database Access TechnologyOptimization Based On .NETWu Ruifeng(2005 Information Management and Information System)Abstract Along with the rapid development of computer and Internet technologies, the technologies of database acces

3、s are increasingly varied and plentiful. With the development of distributed database technology and the popularity of XML WEB services, the requirements of disconnected database access technology and the ability to deal with hierarchical data (XML documents in particular) are increasingly high. NET

4、 as a widely accepted development and application platform, the platform of the database access technology naturally becomes an important research topic. Today, the number of research papers on the. NET platform is becoming more and more, which have their own characteristics and the scope of applica

5、tion, but also have their own structure and emphasis on applications, this article try to do a research from a view on database access technologyoptimization based on.NET platform to sort out the main essence of database access technology on .NET platform, to help the vast numbers of researchers to

6、study and work on .NET platform.Key Words.NET;Database Access Technology;ADO.NET;Database Optimization;目录1.引言12.基于.NET的数据库访问技术2.1.NET框架介绍2.2ADO.NET体系结构概述2.3.NET Framework3.5下的LINQ特性介绍3.基于.Net的数据库访问技术的性能优化3.1优化数据访问3.1.1 DataReader和DataSet的使用3.1.2存储过程的使用3.1.3缓存数据3.2连接池技术的研究3.3其他优化技术4.总结1. 引言在现在这个信息化时代

7、,计算机技术在信息管理中的作用越来越重要,由微软公司开发提供的.Net平台可称得上是计算机开发领域的一场革命,同时它为广大计算机开发人员提供了简单强大的可视化开发工具,大大提高了开发效率,而数据库的访问技术在开发过程中又占了举足轻重的地位,如何为开发人员提供简单、高效、安全的数据库访问技术也自然成了大家关注的焦点之一.在windows系统下的数据库访问技术主要有:ODBC(开放数据库连接),DAO(数据访问对象),RDO(远程数据对象),JDBC(java数据库连接),OLE DB(对象嵌入数据库),ADO(ActiveX数据对象),随着微软.net框架的推出,基于.net平台的数据库访问技术

8、也在原来ado的基础上做出了重大的改进,升级到了全新的数据库访问技术,也是.net平台上最重要的数据库访问技术,下面我们主要对有关的数据库访问技术的进行优化研究,以期对我们的工作与学习提供帮助与参考。2. 基于.NET的数据库访问技术2.1 .Net框架的介绍.NET是Microsoft公司在2000年6月推出的“下一代互联网软件和服务战略”,1.0版本正式发行于2002年,.Net是产品、框架、服务和概念的组合,目的是为常规的或以Web Service方式来部署的软件提供基础架构,一般把.NET分解为三个部分:.NET框架、.NET产品、.NET服务,其中.NET框架是.NET应用程序开发和

9、部署所依赖的技术。.NET框架(.NET framework)是用于建立、部署、运行XML Web服务(XML Web Service)和其他应用程序(包括基于Windows的应用程序、基于Web的应用程序和针对移动设备的应用程序)的编程模型。.NET框架主要由两部分组成:公共语言运行库(Common Language Runtime)和.NET框架类库(Unified Class).公共语言运行库为开发、部署和运行应用程序提供引擎;类库则涵盖了系统函数、数据访问、组件模型、事务处理以与其他服务。如图1所示,.NET框架位于操作系统之上,为应用程序提供基础服务: .NET应用程序 硬件 操作系

10、统公共语言运行库(CLR)类库(UC) .NET框架图1:.NET框架的位置与其组成随着技术的发展,.net框架也由原来的1.0版本发展到了3.5版本了(于2008年随visual studio 2008一起发布),2.0与以后的.NET框架构成如图2所示1:PLINQTPLFUTURE RELEASELINQADO.NET Entity Framework3.5WPFWCFWFCard Space3.0WinformsASP.NETADO.NET.NET Framework2.0Base Class LibraryCommon Language Runtime图2:.NET2.0与2.0以后

11、的框架结构2.2 ADO.NET体系结构概述ADO.NET是微软.NET框架的一部分,它由一组工具和层组成,应用程序可以借此与基于文件或基于服务器的数据存储很轻松地进行通信和管理。在.NET框架中,ADO.NET类库位于System.Data命名空间下。这些类库包括连接到数据源、执行命令以与在存储、操作和获取数据等功能。对于不同的应用需要,ADO.NET设计了两种访问数据库的模式:使用DataReader对象进行基于连接的访问和使用DataAdapter对象进行的非连接的访问。由于这两种模式的设计目的不同,所以在应用程序开发中应该根据实际需要选择合适的数据库访问模式以发挥出ADO.NET的最佳

12、性能,这对于提升应用程序性能有着非常重要的意义。如图3是利用ADO.NET访问数据库的过程2:.NET应用程序DataReader对象Command对象Connection对象数据库DataSet对象DataAdapter对象连接模式非连接模式图3:使用ADO.NET访问数据库的过程ADO.NET与以前的数据访问技术相比的不同之处,就是它可以让应用程序与数据库以完全非连接的数据缓存的方式来交互以实现离线操作数据。过去使用诸如远程数据对象(RDO)来实现这样的功能,但是那只是在已有的技术上做一些修正。而ADO.NET则是基于这样的需求从头开始搭建的。非连接的数据访问(disconnected d

13、ata access)对于今天高要求的应用程序而言是很关键的,它并不是简单地直接把单个用户或系统中的实体连接到数据库。非连接的数据访问的一个要素就是用于表格数据的与数据库无关的容器。这个非连接的容器在ADO.NET类库中是用DataSet或DataTable对象来表示的。设计ADO.NET组件的目的是为了从数据操作中将数据访问分离出来。ADO.NET的两个核心组件会完成此任务:DataSet和.NET Framework数据提供程序,后者是一组包含Connection、Command、DataReader和DataAdapter对象在的组件,其中DataSet是ADO.NET的断开式结构的核心

14、组件,能实现独立于数据源的访问。因此,它可以用于多种不同的数据源,用于XML数据,或用于管理应用程序的本地数据。DataSet是包含一个或多个DataTable对象的集合,这些对象包含数据行和数据列以与主键、外键约束和有关DataTable对象中数据的关系信息。另一个核心组件是.NET Framework数据提供程序,其设计目的是实现数据操作和对数据的快速、向前、只读访问。Connection对象提供与数据源的连接;Command对象用于返回数据、修改数据、运行存储过程以与发送或检索参数信息的数据库命令;DataReader从数据源中得到高性能的数据流; DataAdapter是连接DataS

15、et对象和数据源的桥梁,DataAdapter使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并使DataSet中的数据与数据源保持一致。可以为任何数据源编写.NET Framework数据提供程序,其中ADO.NET的结构如下图所示3:DataSet.NET Framework数据提供程序DataTableCollectionDataAdapterDataTableSelectCommandDeleteCommandConnectionCommandDataReaderDataRowCollectionInsertCommandDataColumnColle

16、ctionUpdateCommandConstraintCollectionDataRelationCollectionXML数据库图4:ADO.NET结构示意图2.3 .NET Framework3.5下的LINQ特性介绍LINQ,语言级集成查询(Language INtegrated Query)自八十年代以来,随着面向对象编程技术的发展,其在各种应用领域已经进入了一个稳定的发展阶段,编程人员对于面向对象中的各种概念也已普遍熟悉并接受。但随着技术的发展,一个新的问题也同时显现出来,即面向对象技术诞生以来并没有解决降低访问和整合信息数据的复杂度的问题,其中主要原因在于最主要的访问数据源与数据

17、库和XML相关。LINQ 提供了一条更常规的途径即给.Net Framework添加一些可以应用于所有信息源(all sources of information )的具有多种用途( general-purpose)的语法查询特性(query facilities),这是比向开发语言和运行时(runtime)添加一些关系数据(relational )特性或者类似 XML 特性(XML-specific)更好的方式。这些语法特性就叫做.NET Language Integrated Query(LINQ) 4。一般来讲,这类查询语句的一个重要特点就是可以并行化执行。虽然有些情况下并行可能会带来一

18、些问题,但这种情况非常少见。这样也就水到渠成地引出了PLINQ这个并行处理的LINQ类库。PLINQ可以以三种方式执行。第一种是管道处理:一个线程用来读取数据源,而其他的线程则用来处理查询语句,二者同步进行虽然这个单一的消费线程可能并不那么容易与多个生产线程同步。不过若是能够仔细配置好负载平衡的话,仍然会极大地减少存占用。第二种模式叫做“stop and go”,用于处理结果集需要被一次返回时(例如调用ToList、ToArray或对结果排序)的情况。在这种模式下,将依次完成各个处理过程,并将结果统一返回给消费线程。这个模式在性能上将优于第一种模式,因为它省去了用来保持线程同步所花费的开销。最

19、后一种方法叫做“inverted enumeration”。该方法并不需要实现收集到所有的输出,然后在单一的线程中处理,而是将最终调用的函数通过ForAll扩展传递到每个线程中。这是目前为止最快的一种处理模式,不过这需要传递到ForAll中的函数是线程安全的,且最好不包含任何lock之类的互斥语句。若是PLINQ中任意的一个线程抛出异常,那么所有的其他线程将会被终止。若是抛出了多个异常,那么这些异常将被组合成一个MultipleFailuresException类型的异常,但每个异常的调用堆栈仍会被保留。3. 基于.Net的数据库访问技术的性能优化3.1 优化数据访问在对应用程序进行性能优化时

20、,其中最为重要的一点就是对数据访问技术进行优化,而在进行性能优化之前我们首先应确定待开发的应用程序是分布式应用程序还是只在一台计算机上运行的独立应用程序,显然随着通信网络的发展,分布式应用程序开发已成主流5,而对于分布式应用程序而言影响其性能的因素主要有以下几种:1. 网络资源 这里的网络资源主要指实际带宽;2. 本地处理资源 如果本地机器有可以利用的资源,则大部分数据处理工作都可以放在本地完成,当然这还要考虑带宽和服务器的处理资源;3. 服务器资源 如果有足够的服务器资源,则在服务器端进行较多处理就相对可取了,这也便于应用程序的升级,对本地机的要求也不高;在实际应用程序开发中,如何使应用程序

21、能够高速运行,这是每个程序开发者都要面对的问题,在使用ADO.NET进行数据库应用程序开发时,通过以下的方法可以改善程序的性能:3.1.1 DataReader和DataSet的使用选择使用DataReader还是使用DataSet需要我们足够了解需要访问的数据的类型以与处理它的方式,需要注意的一点是,不管哪种解决方案更快,都不能说明该组件更好,每个组件都适合特定的任务,而且很擅长该任务6。(1) 存消耗 DataReader和DataSet之间的主要区别是前者的存开销要比后者更小,根据数据量和可用的存资源,与使用更少的存相关的性能优势可能会差别很大。DataReader是一个一次只能让你访问

22、单行记录信息的对象,其含义是,不管结果集的大小,用DataReader来回移动该结果集时,一次只有单行记录加载到存中;另一方面,DataSet是专门为存缓存大量数据而设计的,在这方面,DataSet要比DataReader耗费更多存;因此在访问数据时,若存不是最需要考虑的问题时,则可使用DataSet以利用它的优点,否则DataReader将是一个更合适的选择。(2)遍历方向在一个数据库应用程序中传递数据时,必须考虑数据的遍历方向,可以根据数据遍历的方向要求来改善程序的性能。如果你打算访问数据以便执行一些简单的操作,如以HTML形式通过ASP.NET页面显示结果集中的所有记录,那么就可以使用D

23、ataReader,它专门用于在一个方向上快速读出和显示数据;当不需要在缓冲区中进行数据修改等操作,也不需要索引随机访问数据记录时,DataReader是一个更好的选择,它能提高程序的性能。(3)多个结果集DataReader和DataSet两种类都支持多个结果集的概念,但实现方式不同,DataReader通过NextResult方法来支持访问多个结果集,而DataSet将多个结果集加载到其中不同的DataTable对象中;使用DataSet时,可以访问其中不同的DataTable对象来访问返回的不同结果集,而用DataReader访问多个结果集时,只能进行向前、只读的操作。这意味着如果某个结

24、果集先前已经被访问过,那么除非重置DataReader再从头显示,否则不能再访问该数据集7。3.1.2存储过程的使用存储过程是指存储在数据服务器上预编译好的SQL语句的批命令,存储过程一直被认为是一种让服务器处理数据的好方法,它能显著减少客户机的工作负担;在各种系统开发中,使用存储过程是一个良好的习惯,不仅可以带来临时表、函数、游标等特性,而且调试、升级、维护都变得方便8。使用存储过程还有很多好处,使用它可将SQL语句组合起来并存储在数据库服务器上,经一次调用就可执行。同时由于存储过程是预编译好的,这就省下编译时间并缩短执行时间。客户执行存储过程时,只需调用服务器上的存储过程(有时传递存储过程

25、所需的参数值)而不用发送整个SQL语句,网络上传输的数据就减少了许多9。在下面的情况下应考虑使用存储过程:(1) 有规律地多次执行一条或多条相关的SQL语句;(2) 网络带宽有限;(3) 客户机的处理资源有限,这时需将数据处理委托给服务器承担;(4) 许多客户有规律地执行包含SQL语句的批命令;需要注意的是,使用存储过程来进行数据处理时,当应用发生改变时,一般只需更改数据库服务器上的相关存储过程,这提高了应用程序的灵活性。当然不同的数据库供应商定义的存储过程有些差异,它们可能是由特定的SQL扩展来定义的。3.1.3 缓存数据对一个较大规模的应用程序而言,响应时间是一个需要考虑的重要因素,在应用

26、程序中应尽可能缩短响应时间。在规模较小的应用程序中,访问本地数据时打开和关闭连接的时间开销可能并不是很大,但当数据源是位于网络中另外一个机器上的数据库服务器时,打开连接的时间开销就可能会变得较大了10。遇到这种情况就可以使用预测数据来解决,这时应该比较每次请求都从原始数据库连接获取信息和使用预测数据等待直到信息被请求这两种情况的存开销。DataSet可用来作为存数据缓存,它可以保存多个数据库表的信息,因此是保存预测数据的理想选择。在单个连接的环境中,检索大规模数据总是快于需要每次都进行打开和关闭连接操作的小规模数据检索,因为使用大块数据检索会引起网络遍历较少,响应时间就缩短了。3.2 连接池技

27、术的研究连接池(Connection Pool)是连接对象的集合体,实际上是指拥有一定数量的连接对象的“缓冲存储池”。连接池部提供一种管理机制,能控制连接池部边接对象的个数、使用次数和时间,对应用程序提供获取和释放连接的接口11。在需要高度并发/高度可用应用程序中,大部分时间里用户可能会保持一个打开的连接,而且不是积极地使用该连接,因为用户在使用应用程序的其他功能,意识到这一点很重要。应用程序可以把其宝贵的资源一个打开的连接从本质上切割成时间片断,并且在多个用户之间来池化它。连接池在池中提供一些连接对象,对同一个数据源连接的不同请求可以用同一个连接对象来处理,这样就避免了重新建立一个连接的操作

28、。建立连接池能显著地提高应用程序的性能和可伸缩性。连接池是根据每个唯一的连接字符串创建的,当创建一个池后,将按最小池大小的要求创建多个连接对象并将其添加到该池中。在请求连接时,将根据需要添加到池中,直至达到连接池上限。当达到上限且没有可用的连接,则该请求将会被排入等待队列。当连接被释放回池中时,连接池管理程序通过重新分配连接来满足这些请求12。当请求SqlConnection对象时,如果存在可用的连接,则将从池中获取该对象。若要成为可用连接,该连接当前必须未被使用,具有匹配的事务上下文或者不与任何事务上下文相关联,并且具有与服务器的有效连接。使用ADO.NET的连接池实际上是很简单的,因为你并

29、不需要做什么而仅用默认设置就能使用连接池;相反,如果你不想使用连接池,则需要显式地关闭它。例如对于SqlClient来说,如果你不需要池化连接,就可以简单地把如下键值对添加到连接串中:Pooling=false;类似地,我们可以在连接串上指定特定的键值对来调整连接池的设置,如下表描述了可用于调整连接池行为的连接池键值对13: 表1:可用于连接池的键值对名称默认值说明ConnectionLifeTime0当连接串回到连接池中时,将对它的创建时间和当前时间进行对比,如果时间间隔超过由ConnectionLifeTime指定的值(以秒为单位),则会毁坏该连接。在集群配置中可以使用它来强制在已运行服务

30、器和刚联机的服务器之间达到平衡。如果值为零,则将使池中连接具有最大的超时期限。Connection Resettrue该参数会导致连接在每次从池中取出来使用前重新设置。针对Microsoft SQL Server 7.0,把该值设为false能避免不必要的数据库错误,此外,连接状态本身是不能重置的,默认值为true.Endlisttrue当为true时,如果存在事务上下文,池管理程序将自动在创建线程的当前事务上下文中登记连接Max Pool Size100池中允许的最接数Min Pool Size0池中维护的最小连接数。如果将该值设为1,则能够保证一旦应用程序启动了,在连接池中就至少有一个连接

31、可用Poolingtrue当为true时,将从相应的池中取出连接,或者在必要时创建连接并将其添加到相应的池中;当为true时保证所有连接全部进入连接池如前所述,为了连接到数据库,我们需要指定连接串,ADO.NET为每个连接串都在地维护了一个已打开的连接池。换言之,它把连接串作为键来维护池的集合。通过连接对象上的Open命令来请求打开一个连接时,ADO.NET会在地检查是否存在一个可用的空闲的物理数据库连接。如果一个物理数据连接在其他用户或应用程序的其他模块没有用到时,它就立即被池化。这就意味着想要有效地利用连接池,就必须尽可能晚地打开连接,并且尽可能早地关闭连接。这些连接池参数都有默认的数值,

32、各种参数与其默认值如上表所示。当应用程序用完连接,并且调用连接对象上的Dispose或Close时,中间类就把该连接标记为未启用或未分配,但把它保留为第二个可能请求它的用户。3.3 其他优化技术关闭连接:良好的应用程序设计我们知道,连接对象必须实现IDisposable接口。通常,IDisposable.Dispose方法是任何对象用于清除工作的方法,当不再需要对象时,对象的使用者可以调用此方法垃圾回收器会自动释放分配给该对象的存14。程序员在看到这个方法时都应知道去调用它,而在C#和VB.NET存在诸如using代码块这样的结构,能自动调用Dispose方法。ADO.NET连接对象完全遵循这

33、样的规则:它使用Dispose方法清空所有未分配的资源。除了清空未分配的资源外,Dispose方法还调用连接对象的close,使得连接可以在连接池准备被重用。除了调用close外,Dispose只比Close方法多干了一点事情:Dispose清除了部集合从而清空了各种设置诸如连接对象上的连接串,因此它可以让垃圾收集器重用那些被具体连接对象所占用的存;但是,单独调用Close方法能使实际的底层对象在连接池中变为可重用。与数据库进行交互的最常见的方式是通过数据访问层来实现。数据访问层为一组公共类,应用程序的各个部分都需要通过它们才能与数据库打交道。实现数据访问层的优势如下:n 数据访问类的作者会确

34、保连接尽可能是地弃置(而且会关闭);n 可以把性能优化放在数据访问层;n 即使数据访问层有连接泄漏(所打开的连接没有关闭),也可以很容易跟踪出来并且修改掉;在数据访问层,或者如果没有实现数据访问层的话就在外部使用using代码块或try.cathc.finally结构体来确保连接总是被合适的弃置。最后,我们看一下Close和Dispose方法之间的不同之处,或者两者都不调用的情况:n 调用连接对象的Close方法可以让底层连接池化;n 调用连接对象的Dispose方法可以让我们不用再地调用连接的Close方法。它不仅确保了底层连接被池化,而且也确保了所分配的资源被垃圾收集;n 既不调用Clos

35、e也不调用Dispose会显著地降低应用程序的性能,因为这样会把连接池增加到最大限制值,接着任何人都必须等待下一个可用的连接对象。不仅如此,甚至当打开的连接超出围,它们在很长时间也不会被垃圾收集,因为连接对象本身并不会占用太多存,而存不足是垃圾收集器触发并且开始工作的唯一标准。简而言之,Dispose方法是最佳选择,因为它有助垃圾收集和连接池化;Close是其次的选择,因为它只有助于连接池化;而既不调用Colse也不调用Dispose是很糟糕的,我们不应那么做。4. 总结以上,我们通过在对.NET Framework和ADO.NET框架进行简单介绍的基础上,着重探讨了基于.NET平台的数据库访

36、问技术的优化问题,具体包括了在读取数据时读取方式的选择(连接方式还是非连接方式),表现为对DataSet和DataReader的选择,通过使用存储过程一方面可以提高应用程序的灵活性,另一方面也减轻网络负担和降低对客户机的性能要求,充分发挥服务器的性能优势,通过建立连接池能显著地提高应用程序的性能和可伸缩性,最后我们通过对IDisposable的Dispose和Close方法的讨论,强调了良好的应用程序设计习惯对于优化数据访问的重要性,开发人员在实际应用中应根据实际情况,使用适当的方法对.NET平台下的数据库访问技术的进行优化,以更好地提高应用程序的性能。注释: 程序员现在都已经认同像 类(cl

37、asses)、对象(objects)、方法(methods)这样的语言特性参考文献1 Soumyasch, File:DotNet.svg, 2009:03-28. :/en.wikipedia.org/wiki/File:DotNet.svg2熊慧芳,莉.基于ADO.NET的数据库访问技术研究J.科技广场,200703(3):123124.3 金灿,瑞君等 .NET框架中三种数据库访问技术与效率比较J.计算机应用研究,2003(4):155157.4 conanpaul博客.浅谈Linq To Sql集成数据库语言的优劣.2008-01-072009-04-10 :/tech.it168./

38、msoft/2008-01-17/3029.shtml.5 岳敏.基于.NET分布式数据库访问技术的研究与改进硕士学位论文.:大学,2007:2-5.6 Sahil Malik.汤涛,邰晓翠,译. ADO.NET2.0高级程序设计M. :人民邮电,2007-6:442-4457 希凡.基于.NET框架的WEB数据库访问技术的研究与实现硕士学位论文.:理式大学,2006:44.8 宗英.SQL存储过程在.NET数据库中的运用J.信息科技,2008(15):109.9 志波.NET中统一的存储过程调用方法J.计算机应用,200311(11):153154.10 友华,王贤平,吴伟. .NET环境下数据库应用系统开发技术M. 科学,2004-12,238-24011 谢招犇,卫华.数据库连接池模型的分析与优化J.现代计算机,20064(4):912 德礼,少芳.ADO.NET连接池技术与其在Web系统开发中的应用J.工学院学报,2007-2(1)13 同6,606114 IDisposble接口:.NET Framework技术资源库.2009430:/msdn.microsoft./zh-/library/system.idisposable.aspx15 / 15

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作计划

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁