女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]在企業(yè)級軟件開發(fā)過程中,為了改善應(yīng)用程序的性能需要通常使用對象池來控制對象的實(shí)例化。例如,在我們每次需要連接一個(gè)數(shù)據(jù)庫時(shí)都需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫連接,而數(shù)據(jù)庫連接是非常昂貴的對象。所以,為了節(jié)省為每次數(shù)據(jù)

在企業(yè)級軟件開發(fā)過程中,為了改善應(yīng)用程序的性能需要通常使用對象池來控制對象的實(shí)例化。例如,在我們每次需要連接一個(gè)數(shù)據(jù)庫時(shí)都需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫連接,而數(shù)據(jù)庫連接是非常昂貴的對象。所以,為了節(jié)省為每次數(shù)據(jù)庫調(diào)用都實(shí)例化一個(gè)數(shù)據(jù)庫連接的資源,我們可以緩存并重用一些創(chuàng)建好的數(shù)據(jù)庫連接對象并通過節(jié)省為每次數(shù)據(jù)庫調(diào)用都創(chuàng)建一個(gè)數(shù)據(jù)庫連接對象的時(shí)間和資源來大幅度提高程序性能。

? 對象池與圖書館很像。圖書館里維護(hù)很多書籍。當(dāng)對某本書的需求增加時(shí),圖書館就會(huì)買更多書,否則的話讀者們就會(huì)一直使用同一本書。在對象池中,首先我們檢查對象是否已經(jīng)被創(chuàng)建且被放到池中,如果已經(jīng)被放到池中,我們就會(huì)得到對象池中緩存的對象;如果沒有找到就會(huì)創(chuàng)建一個(gè)新的對象并放到對象池中以備之后使用。對象池計(jì)數(shù)廣泛地用于大規(guī)模應(yīng)用程序服務(wù),比如企業(yè)級Java組件模型(Enterprise Java Beans Servers, EJB),MTS/COM+, 甚至在.NET Framework中.

? 在這部分,我們將開發(fā)一個(gè)數(shù)據(jù)庫連接池來緩存數(shù)據(jù)庫連接。創(chuàng)建數(shù)據(jù)庫連接是很昂貴的。在一個(gè)典型的Web應(yīng)用中可能有幾千個(gè)用戶同時(shí)訪問站點(diǎn)。如果這些用戶恰好想要訪問數(shù)據(jù)庫的動(dòng)態(tài)數(shù)據(jù)而我們繼續(xù)為每個(gè)用戶創(chuàng)建一個(gè)數(shù)據(jù)庫連接的話,我們將對應(yīng)用程序的性能帶來負(fù)面影響。創(chuàng)建一個(gè)新的對象要求更多內(nèi)存。內(nèi)存分配會(huì)降低應(yīng)用程序性能,最后的結(jié)果是Web站點(diǎn)在分發(fā)動(dòng)態(tài)內(nèi)容時(shí)變得非常慢,或者到達(dá)一個(gè)臨界值導(dǎo)致站點(diǎn)崩潰。連接池維護(hù)一個(gè)已創(chuàng)建的對象池,所以需要一個(gè)數(shù)據(jù)庫連接的應(yīng)用程序可以從池中借一個(gè)連接并在用完以后還給對象池,而不是創(chuàng)建一個(gè)新的數(shù)據(jù)庫連接。一旦數(shù)據(jù)發(fā)送給一個(gè)用戶,對象的數(shù)據(jù)庫連接就會(huì)被收回以備之后使用。

實(shí)現(xiàn)對象池

? 讓我們看一個(gè)我們的由類圖描述的數(shù)據(jù)庫連接池應(yīng)用。圖 5 顯示了ObjectPool 類和繼承自O(shè)bjectPool的DBConnectionSingleton 類。

圖 5

ObjectPool 類

? 我們先貼出ObjectPool 類的代碼然后開始討論:

/*************************************
/*?copyright?(c)?2012?daniel?dong
?*?
?*?author:daniel?dong
?*?blog:??www.cnblogs.com/danielwise
?*?email:?guofoo@163.com
?*?
?*/

using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.Collections;
using?System.Timers;

namespace?ObjectPoolSample
{
????public?abstract?class?ObjectPool
????{
????????//Last?Checkout?time?of?any?object?from?the?pool.
????????private?long?lastCheckOut;

????????//Hashtable?of?the?check-out?objects.
????????private?static?Hashtable?locked;

????????//Hashtable?of?available?objects
????????private?static?Hashtable?unlocked;

????????//Clean-Up?interval
????????internal?static?long?GARBAGE_INTERVAL?=?90?*?1000;?//90?seconds
????????static?ObjectPool()
????????{
????????????locked?=?Hashtable.Synchronized(new?Hashtable());
????????????unlocked?=?Hashtable.Synchronized(new?Hashtable());
????????}

????????internal?ObjectPool()
????????{
????????????lastCheckOut?=?DateTime.Now.Ticks;

????????????//Create?a?Time?to?track?the?expired?objects?for?cleanup.
????????????Timer?aTimer?=?new?Timer();
????????????aTimer.Enabled?=?true;
????????????aTimer.Interval?=?GARBAGE_INTERVAL;
????????????aTimer.Elapsed?+=?new?ElapsedEventHandler(CollectGarbage);
????????}

????????protected?abstract?object?Create();

????????protected?abstract?bool?Validate(object?o);

????????protected?abstract?void?Expire(object?o);

????????internal?object?GetObjectFromPool()
????????{
????????????long?now?=?DateTime.Now.Ticks;
????????????lastCheckOut?=?now;
????????????object?o?=?null;

????????????lock?(this)
????????????{
????????????????try
????????????????{
????????????????????foreach?(DictionaryEntry?myEntry?in?unlocked)
????????????????????{
????????????????????????o?=?myEntry.Key;
????????????????????????unlocked.Remove(o);
????????????????????????if?(Validate(o))
????????????????????????{
????????????????????????????locked.Add(o,?now);
????????????????????????????return?o;
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????Expire(o);
????????????????????????????o?=?null;
????????????????????????}
????????????????????}
????????????????}
????????????????catch?(Exception)?{?}
????????????????o?=?Create();
????????????????locked.Add(o,?now);
????????????}
????????????return?o;
????????}

????????internal?void?ReturnObjectToPool(object?o)
????????{
????????????if?(o?!=?null)
????????????{
????????????????lock?(this)
????????????????{
????????????????????locked.Remove(o);
????????????????????unlocked.Add(o,?DateTime.Now.Ticks);
????????????????}
????????????}
????????}

????????private?void?CollectGarbage(object?sender,?ElapsedEventArgs?ea)
????????{
????????????lock?(this)
????????????{
????????????????object?o;
????????????????long?now?=?DateTime.Now.Ticks;
????????????????IDictionaryEnumerator?e?=?unlocked.GetEnumerator();

????????????????try
????????????????{
????????????????????while?(e.MoveNext())
????????????????????{
????????????????????????o?=?e.Key;

????????????????????????if?((now?-?(long)unlocked[o])?>?GARBAGE_INTERVAL)
????????????????????????{
????????????????????????????unlocked.Remove(o);
????????????????????????????Expire(o);
????????????????????????????o?=?null;
????????????????????????}
????????????????????}
????????????????}
????????????????catch?(Exception)?{?}
????????????}
????????}
????}
}

? ObjectPool 類有兩個(gè)重要的方法; GetObjectFromPool(), 從對象池中獲取一個(gè)對象, ReturnObjectToPool(), 把對象還給對象池。我們以兩個(gè)哈希表實(shí)現(xiàn)對象池,一個(gè)稱為locked, 另一個(gè)稱為unlocked. locked 哈希表包含所有正在使用的對象而unlocked 哈希表包含了所有未被使用且可隨時(shí)使用的對象。ObjectPool 還有三個(gè)三個(gè)必須重載的方法:Create(), Validate() 和 Expire(), 它們必須由繼承類實(shí)現(xiàn)。

? 總而言之,ObjectPool 類中有三個(gè)關(guān)鍵部分:

? 使用GetObjectFromPool()?來從對象池中獲取一個(gè)對象,當(dāng)需要向?qū)ο蟪刂刑砑右粋€(gè)對象時(shí)必須使用鎖,由于這個(gè)過程locked 和 unlocked 哈希表的內(nèi)容會(huì)發(fā)生變化而我們不想在這個(gè)過程中發(fā)生沖突。

? 使用ReturnObjectToPool()?來把一個(gè)對象返回給對象池,同樣需要使用鎖,理由同上。

? 使用CollectGarbage()?從對象池中清除過期對象,在這個(gè)方法中我們遍歷unlocked哈希表以便從對象池中找到并移除過期對象。這個(gè)過程中unlocked哈希表的內(nèi)容可能會(huì)發(fā)生改變所以我們需要使用鎖來保證這一過程是原子操作。

??GetObjectFromPool()?方法中,我們遍歷unlocked哈希表來獲取第一個(gè)可用對象。獲得了以后使用Validate() 方法去驗(yàn)證指定對象。基于不同的緩存對象類型,Validate()方法的實(shí)現(xiàn)也可能有很大不同。例如,如果對象是一個(gè)數(shù)據(jù)庫連接,那么繼承對象池的類就需要實(shí)現(xiàn)Validate()方法來檢查數(shù)據(jù)庫連接是打開的還是關(guān)閉的。如果對象池對象驗(yàn)證通過了,我們從unlocked哈希表中移除這個(gè)對象并把它放到locked哈希表中。locked 哈希表中的對象表示正在使用的對象。如果驗(yàn)證失敗,我們就使用Expired()方法把對象注銷。Expire()方法也需要通過繼承類實(shí)現(xiàn)并根據(jù)不同的緩存對象類型而有不同的實(shí)現(xiàn)形式。還是以一個(gè)數(shù)據(jù)庫連接為例,過期對象將關(guān)閉數(shù)據(jù)庫連接。如果沒有找到一個(gè)緩存對象,說明unlocked哈希表是空的,我們使用Create()方法創(chuàng)建一個(gè)新對象然后把它放入到locked哈希表中。

??ReturnObjectToPool()?方法的實(shí)現(xiàn)相對簡單一些。我們僅僅需要將對象從locked哈希表中移除并把它放回unlocked哈希表中以備另用。在整個(gè)回收過程中,我們不得不考慮應(yīng)用程序的內(nèi)存使用情況。對象池與內(nèi)存使用量成正比。所以,我們緩存的對象越多,就需要使用更多內(nèi)存。為了控制內(nèi)存使用量,我們應(yīng)該周期性地對池中的對象進(jìn)行垃圾回收處理。這可以通過對池中每個(gè)對象加一個(gè)超時(shí)周期來實(shí)現(xiàn)。如果在超時(shí)時(shí)間內(nèi)一個(gè)緩存對象沒有被使用,那么它將會(huì)被作為垃圾回收。結(jié)果就是對象池的內(nèi)存使用量將很大程序上取決于系統(tǒng)負(fù)載。

??CollectGarbage()?方法用來處理對象池的垃圾回收。這個(gè)方法由ObjectPool構(gòu)造函數(shù)中初始化的一個(gè)Timer委托進(jìn)行調(diào)用。在我們的例子中,我們通過GARBAGE_COLLECT 常量將垃圾回收時(shí)間間隔定位90秒。

? 我們還沒有實(shí)現(xiàn)任何數(shù)據(jù)庫連接相關(guān)的代碼,所以我們假設(shè)ObjectPool 類可以用于對.NET Framework 中的所有類型進(jìn)行緩存。

DBConnectionSingleton 類

? DBConnectionSingleton 類實(shí)現(xiàn)了一個(gè)數(shù)據(jù)庫連接對象池。這個(gè)類的主要目的是為繼承自O(shè)bjectPool 類的特定數(shù)據(jù)庫連接實(shí)現(xiàn)Create(), Validate() 和 Expire()方法。這個(gè)類也提供BorrowDBConnection() 和 ReturnDBConnection() 方法來從對象池中借出/返還數(shù)據(jù)庫連接。

? DBConnectionSignletion 類的完整代碼片段如下:

/*************************************
/*?copyright?(c)?2012?daniel?dong
?*?
?*?author:daniel?dong
?*?blog:??www.cnblogs.com/danielwise
?*?email:?guofoo@163.com
?*?
?*/

using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.Data.SqlClient;
using?System.Data;

namespace?ObjectPoolSample
{
????public?sealed?class?DBConnectionSingletion?:?ObjectPool
????{
????????private?DBConnectionSingletion()?{?}

????????public?static?readonly?DBConnectionSingletion?Instance?=?
????????????new?DBConnectionSingletion();

????????private?static?string?connectionString?=
????????????@"server=(local);Trusted?Connection=yes;database=northwind";

????????public?static?string?ConnectionString
????????{
????????????get
????????????{
????????????????return?connectionString;
????????????}
????????????set
????????????{
????????????????connectionString?=?value;
????????????}
????????}

????????protected?override?object?Create()
????????{
????????????SqlConnection?conn?=?new?SqlConnection(connectionString);
????????????conn.Open();
????????????return?conn;
????????}

????????protected?override?bool?Validate(object?o)
????????{
????????????try
????????????{
????????????????SqlConnection?conn?=?(SqlConnection)o;
????????????????return?!conn.State.Equals(ConnectionState.Closed);
????????????}
????????????catch?(SqlException)
????????????{
????????????????return?false;
????????????}
????????}

????????protected?override?void?Expire(object?o)
????????{
????????????try
????????????{
????????????????SqlConnection?conn?=?(SqlConnection)o;
????????????????conn.Close();
????????????}
????????????catch?(SqlException)?{?}
????????}

????????public?SqlConnection?BorrowDBConnection()
????????{
????????????try
????????????{
????????????????return?(SqlConnection)base.GetObjectFromPool();
????????????}
????????????catch?(Exception?e)
????????????{
????????????????throw?e;
????????????}
????????}

????????public?void?ReturnDBConnection(SqlConnection?conn)
????????{
????????????base.ReturnObjectToPool(conn);
????????}
????}
}

? 由于你正在處理的是SqlConnection對象,所以Expire()方法用來關(guān)閉SqlConnection, Create() 方法用來創(chuàng)建SqlConnection 而 Validate() 則用來檢查SqlConnection 是打開的還是關(guān)閉的。使用DBConnectionSigleton 對象實(shí)例可以使整個(gè)同步問題對客戶端應(yīng)用程序透明。

為什么要使用單例模式?

? Singleton 是一個(gè)著名的創(chuàng)建型設(shè)計(jì)模式,當(dāng)你需要一個(gè)對象僅對應(yīng)一個(gè)實(shí)例時(shí)通常需要使用它。設(shè)計(jì)模式一書(ISBN 0-201-70265-7)中對設(shè)計(jì)單例模式目的定義為保證一個(gè)類僅有一個(gè)實(shí)例,并提供全局唯一的方式來訪問它。為了實(shí)現(xiàn)一個(gè)單例,我們需要一個(gè)私有構(gòu)造函數(shù)以便于客戶端應(yīng)用程序無論如何都沒法創(chuàng)建一個(gè)新對象,使用靜態(tài)的只讀屬性來創(chuàng)建單例類的唯一實(shí)例。.NET Framework 在JIT 過程中僅當(dāng)有任何方法使用靜態(tài)屬性時(shí)才會(huì)將其實(shí)例化。如果屬性沒有被使用,那么也就不會(huì)創(chuàng)建實(shí)例。更準(zhǔn)確地說,僅當(dāng)有任何類/方法對類的靜態(tài)成員進(jìn)行調(diào)用時(shí)才會(huì)構(gòu)造對應(yīng)單例類的實(shí)例。這個(gè)特性稱作惰性初始化并把創(chuàng)建對象的過程留給第一次訪問實(shí)例屬性的代碼。.NET Framework 保證共享類型初始化時(shí)的類型安全。所以我們不需要擔(dān)心DBConnectionSingleton對象的線程安全問題,因?yàn)樵趹?yīng)用程序整個(gè)生命周期內(nèi)金輝創(chuàng)建一個(gè)實(shí)例。實(shí)例靜態(tài)屬性維護(hù)DBConnectionSingleton類對象的唯一實(shí)例。

使用數(shù)據(jù)庫連接池

? 現(xiàn)在已經(jīng)準(zhǔn)備好使用數(shù)據(jù)庫連接池了,下面的代碼片段顯示了如何實(shí)例化并使用數(shù)據(jù)庫連接池:

/*************************************
/*?copyright?(c)?2012?daniel?dong
?*?
?*?author:daniel?dong
?*?blog:??www.cnblogs.com/danielwise
?*?email:?guofoo@163.com
?*?
?*/

using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.Configuration;
using?System.Data.SqlClient;

namespace?ObjectPoolSample
{
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????//Initialize?the?Pool
????????????DBConnectionSingletion?pool?=?DBConnectionSingletion.Instance;

????????????//Set?the?ConnectionString?of?the?DatabaseConnectionPool
????????????ConnectionStringSettings?settings?=?ConfigurationManager.ConnectionStrings["NorthwindConnectionString"];
????????????DBConnectionSingletion.ConnectionString?=?settings.ConnectionString;
????????????//Borrow?the?SqlConnection?object?from?the?pool
????????????SqlConnection?conn?=?pool.BorrowDBConnection();

????????????//Return?the?Connection?to?the?pool?after?using?it
????????????pool.ReturnDBConnection(conn);

????????????Console.ReadLine();
????????}
????}
}

? 在上面的例子中,我們通過DBConnectionSingletion 類的實(shí)例屬性來初始化它的實(shí)例。如上面討論的,我們假設(shè)使用單例設(shè)計(jì)模式可以保證我們有且僅有一個(gè)DBConnectionSingletion 對象的實(shí)例。我們把ConnectionString 屬性設(shè)置為本機(jī)SQL Server實(shí)例上的北風(fēng)數(shù)據(jù)庫?,F(xiàn)在,我們可以使用對象池的BorrowDBConnection() 方法來從對象池借一個(gè)數(shù)據(jù)庫連接, 然后通過調(diào)用對象池的ReturnDBConnection() 方法來返還數(shù)據(jù)庫連接。如果你真的想看看應(yīng)用程序池是如何運(yùn)行的,那么最好的方式就是打開Visual Studio .NET 中的工程并在調(diào)試模式下跟蹤上面給出的應(yīng)用程序代碼。

?

總結(jié)

在企業(yè)級計(jì)算的多線程世界中同步是一個(gè)極其重要的概念。它被廣泛用于數(shù)據(jù)庫,消息隊(duì)列以及Web 服務(wù)器等聞名應(yīng)用上。任何開發(fā)多線程應(yīng)用程序的開發(fā)人員都必須對他們的同步概念特別清楚。不是為了讓每個(gè)對象都是線程安全的而導(dǎo)致系統(tǒng)不堪重負(fù),而是應(yīng)該關(guān)注死鎖情況并在程序設(shè)計(jì)之初就解決盡可能多的死鎖問題。理解同步帶來的性能瓶頸問題同樣很重要,因?yàn)樗鼘⒂绊憫?yīng)用程序的總體性能。在這一章,除了探討.NET Framework 中自帶的同步特性,我們也開發(fā)了兩個(gè)有用的應(yīng)用程序:

? 一個(gè)自定義的線程安全包裝器。在這個(gè)例子中,你學(xué)到了如何為你的類庫添加原生同步支持并為調(diào)用類庫的開發(fā)人員提供是否使用同步的選項(xiàng)。這將幫助第三方開發(fā)人員關(guān)注于他們自己的應(yīng)用程序而不是類庫的線程安全問題。

? 一個(gè)數(shù)據(jù)庫連接池。在這個(gè)例子中,你開發(fā)了可以用于任意相似對象類型的對象池。有了對象池,我們繼續(xù)開發(fā)了一個(gè)繼承自對象池的數(shù)據(jù)庫連接池。對象池可以用于任意對象。

至此,第三章 使用線程 的內(nèi)容已經(jīng)全部介紹完畢,我們學(xué)到了如何使用單線程,多線程,如何解決多線程并發(fā)問題,多線程并發(fā)時(shí)可以使用的不同的鎖,以及如何使用對象池。這些都為我們理解多線程及其并發(fā)提供了很大幫助,希望第三章能給你開發(fā)大規(guī)模應(yīng)用程序時(shí)提供一些參考抑或幫助。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉