㈠ 想請問一下Adp.net與Ado.net Entity Framework、NHibernate性能對比
Ado.net 簡單,代碼均可見,具體的sql是自己能靈活控制的;代碼也能用生成器很容易生成。
Entity Framework 用linq操作,操作簡單,很方便,但封裝性強,不需要自己寫數據訪問層代碼,不過調試時比較難一點,還有一些什麼類型不支中正持的問題。不能很容易地用代碼生成器生成。linq生成的操作資料庫的代碼有一定的格式,不像手寫的那麼簡潔;單純在數旦培殲據庫性能上,數據傳輸量稍微大一點。
NHibernate 資料庫操作上,與 Entity Framework 差模沖不多。
㈡ 為什麼.net中要使用Spring和NHibernate
nhibernate只胡碧是對.net的功能擴展,個人認為,把宴做禪簡單的問題復雜話了,要加很多配置文件,性能也沒有保障。並不適合大型系統開發晌塵。
㈢ 如何使用Nhibernate動態連接Oracle資料庫
關於如何使用Nhibernate配置連接其支持的數據源,網上一些相關的文檔已經詳細作了說明,同時在其2.0幫助文檔中也有相關的描述。一般常用的有兩種方式:
一、使用配置文件nfig)連接資料庫
下面以使用Nhibernate2.2連接Oracle10資料庫為例,給出連接配置信息如下:
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
<property name="nnection_string">User ID=hzga;Password=hzga;Data Source=orcl;Persist Security Info=True;</property>
<property name="show_sql">false</property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
</session-factory>
</hibernate-configuration>
二、通過提供一個IDictionary實例連接資料庫
下面還是以使用Nhibernate2.2連接Oracle10資料庫為例,給出連接配置信息如笑山下:
cfg = new Configuration();
隱緩IDictionary<string, string> connProps = new Dictionary<string, string>();
connProps.Add("connection.driver_class", "NHibernate.Driver.OracleClientDriver");
connProps.Add("nnection_string", "User ID=hzga;Password=hzga;Data Source=orcl;Persist Security Info=True;");
connProps.Add("query.substitutions", "true 1, false 0, yes 'Y', no 'N'");
connProps.Add("dialect", "NHibernate.Dialect.Oracle10gDialect");
connProps.Add("proxyfactory.factory_class", "NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu");
cfg.SetProperties(connProps);
cfg.AddAssembly(AssemblyName);
sessions = cfg.BuildSessionFactory();
三、如何使用Nhibernate動態直接連接Oracle資料庫
上述兩種方式都可以成功連接到Oracle資料庫,但是前提條件是運行程序時需要安裝Oracle客戶端。在程序發布部署的時候安裝Oracle客戶端是一件非碰攜中常麻煩的事件,那麼有沒有一種比較好的方法可以直接連接Oracle資料庫,同時又不必安裝Oracle客戶端呢。
答案是肯定的,下面提供兩種方式直接連接Oracle資料庫:
1、通過OleDB和Oracle公司的驅動
cfg = new Configuration();
IDictionary<string, string> connProps = new Dictionary<string, string>();
connProps.Add("connection.driver_class", "NHibernate.Driver.OleDbDriver");
connProps.Add("nnection_string", "Provider=OraOLEDB.Oracle.1;User ID=hzga;Password=hzga;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.13.148)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl)))");
connProps.Add("query.substitutions", "true 1, false 0, yes 'Y', no 'N'");
connProps.Add("dialect", "NHibernate.Dialect.Oracle10gDialect");
connProps.Add("proxyfactory.factory_class", "NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu");
cfg.SetProperties(connProps);
cfg.AddAssembly(AssemblyName);
sessions = cfg.BuildSessionFactory();
2、通過OLEDB和微軟公司的Oracle驅動
cfg = new Configuration();
IDictionary<string, string> connProps = new Dictionary<string, string>();
connProps.Add("connection.driver_class", "NHibernate.Driver.OleDbDriver");
connProps.Add("nnection_string", " Provider=MSDAORA.1;User ID=lportal;Password=lportal;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = zhbrserver)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl)))");
connProps.Add("query.substitutions", "true 1, false 0, yes 'Y', no 'N'");
connProps.Add("dialect", "NHibernate.Dialect.Oracle10gDialect");
connProps.Add("proxyfactory.factory_class", "NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu");
cfg.SetProperties(connProps);
cfg.AddAssembly(AssemblyName);
sessions = cfg.BuildSessionFactory();
㈣ 關於c# NHibernate資料庫的連接,求助
NHibernate各種資料庫連接參數文件配置方法說明
//配置文件Config/Hibernate.cfg.xml內容如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="CwfServer">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="connection.connection_string">server=192.168.1.244;database=wf_db_t;uid=sa;pwd=supersit.1;</property>
<property name="adonet.batch_size">10</property>
<property name="show_sql">true</property>
<property name="辯襲明command_timeout">60</property>
<攜告property name="hbm2ddl.auto">update</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<!--<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>-->
<mapping assembly="Net.NHibernateDB"/>
<禪櫻mapping assembly="Cwfapi"/>
<mapping assembly="CwfEngine"/>
</session-factory>
</hibernate-configuration>
㈤ NHibernate已經足夠了嗎
並且在博客園開了一個專欄寫了一系列的文章來介紹如何使用它。到2005年後半年的時候,國內類似的代碼生成工具已經開始「泛濫」了,O/RM一下子流行起來。在2005年賀拍底,我開始關注NHibernate,並逐漸轉移到NHibernate上面來,對XCodeFactory的依賴也越來越小了。畢竟,NHibernate是如此得強大,以至於我不再需要XCodeFactory。
但是,對於經常要編寫資料庫訪問代碼的.NET開發人員而言,擁有NHibernate就已經足夠了嗎?我認為是不夠的。NHibernate在基於對象方面做得非常好,這也是它初始的目標,它非常出色地實現了這個目標。但是在O/RM之外了?比如,薯伍我們需要進行批量的更新、刪除等,使用NHibernate進行類似的禪手羨操作不僅繁瑣而且效率低下。當然,這些內容不是NHibernate的職責,NHibernate也不用關心這些O/RM之外的東西。但是,我們也許都知道了,NHibernate需要另外一個工具來作為有力的補充,這個補充主要基於關系、而不是對象來操作資料庫中的數據。
有人選擇了EnterpriseLibrary中的數據訪問Block作為O/RM之外的補充,這很不錯。而DataRabbit是另外一個選擇。
相信來我blog的朋友都一定知道ESFramework,ESFramework源於EnterpriseServerBase類庫的Network命名空間,而DataRabbit來源於EnterpriseServerBase類庫的DataAccess命名空間,EnterpriseServerBase.DataAccess也是XCodeFactory核心庫。DataRabbit中包含多個基於關系的數據訪問介面,並且內置了對SqlServer、Oracle、Ole的支持,如果要支持其它類型的資料庫,只需實現相應的介面即可,並且可以插件的形式提供。
(1)簡化通常的數據訪問,體現在IADOBase介面,IADOBase介面和以下所有介面均獨立於資料庫類型。
(2)數據分頁 IPagerManager
(3)事務 Transaction
(4)分布式事務 Distributed
(5)操作數據大綱(DataSchema) IDataSchemaOperator ,比如獲取某個表的大綱結構(Column信息、主鍵信息、外鍵信息),依據大綱在指定的資料庫中創建表
(6)資料庫適配器插件 IADOBaseAddin
(7)簡單數據遷移 SimpleDataTransfer
這些介面將在後面的系列文章中逐一介紹。下面也看一個分頁的例子,來點感性的認識。
㈥ NHibernate是什麼
對象關系映射(O/R Mapping,Object Relational Mapping)表示一種技術,用來把對象模型表示的對象映射到基於SQL 的關系模型數據結構中去。 NHibernate不僅僅管理.NET 類到資料庫表的映射(包括.NET 數據類型到SQL 數據類型的映射),還提供數據查詢和獲取數據的方法,大幅度減少我們開發時人工使用SQL和ADO.NET處理數據的時間。NHibernate的目標是對於開發世蠢源者通常的數據持久化相關的編程任務,解放其中的95%。並請記住NHibernate作為資料庫訪問層,是與你的檔液程序緊密集成的。 NHibernate的架構 你知道NHibernate到底什麼樣子?下面我摘取官方文檔中的三幅不同的結構圖稍做說明。 第一幅圖:NHibernate體系結構非常抽象的概覽 這幅圖展示了NHibernate在資料庫和應用程序之間提供了一個持久層。 第一幅圖好搜態像非常簡單?其實NHibernate是比較復雜的。我們了解兩種極端情況,輕量級和重量級架構。
㈦ NHibernate中的schema是干什麼用的
關於NHibernate和NHibernate中的schema的問題,你可以參考一下以下文章:
什麼是NHibernate
NHibernate 是一個基於.Net 的針對關系型資料庫的對象持久化類庫。Nhibernate 來源於非常優秀的基於Java的Hibernate 關系型持久化工具。
NHibernate 從資料庫底層來持久化數則你的.Net 對象到關系型資料庫。NHibernate 為你處理這些,遠勝於你不得不寫SQL去從資料庫存取對象。你的代碼僅僅和對象關聯,NHibernat 自動產生SQL語句,並確保對象提交到正確的表和欄位中去。
為什麼寫這個指南
任何熟悉Hibernate的人會發現這篇指南和Glen Smith 的 A Hitchhiker』s Guide to Hibernate 非常相近。這里的內容正是基於他的指南,因此所有的感謝都應該給與他。
NHibernate的文檔並非每處都和Hibernate的文檔一致。然而,項目的相似應該能使讀者通過讀Hibernate的文檔來很好的理解NHibernate如何工作。
這篇文檔意在讓你盡可能快的開始使用NHibernate。它將介紹如何持久化一個簡單的對象到一張表裡。想得到更多的復雜的例子,可以參考NUnit測試及附帶代碼。
開發的過程
Nhibernate未來將會提供一些工具幫助你自動產生schema文件(現在還是基於代碼)或是通過映射文件產生類(在籌措階段)或是更新schema(來自於一個新開發者的建議)。然而,這里我們的例子是假定一切來自於完全手寫,包括設置表和.Net類的編寫。我們將進行以下步驟。
1.新建一個將要持久化.Net對象的表
2.構建一個需要被持辯核久化的.Net類
3.構建一個可以讓NHibernate知道如何持久化對象屬性的映射文件
4.構建一個讓NHibernate知道如何連接資料庫的配置薯灶棚文件]
5.使用NHibernate的API
第一步:寫構建表的SQL
這里我們將使用的是一個非常簡單的例子。假設你正在為你的網站開發一個基本的用戶管理子系統。我們將使用如下的一張User表(假定你已經設置好一個資料庫—在的例子里我稱它為NHibernate)。
use NHibernate
go
CREATE TABLE users (
LogonID nvarchar(20) NOT NULL default 』0』,
Name nvarchar(40) default NULL,
Password nvarchar(20) default NULL,
EmailAddress nvarchar(40) default NULL,
LastLogon datetime default NULL,
PRIMARY KEY (LogonID)
)
go
我使用的是MS Sql Server 2000, 但也可以使用任何資料庫,只要你有關於它們的基於.Net數據提供驅動程序。我們將得到一個含有LogonID,Name, Password, Email 和LastLogon的表. 經過以上標准步驟,我們下一步是寫一個.Net類處理一個給定的User對象。
第二步:產生一個.Net 類文件
當內存中有一堆User對象的時候,我們需要某種對象去保存它們。NHibernate通過對象屬性的反射來工作,因此我們需要添加我們希望持久化的對象屬性。一個可以被NHibernate持久化的類應該看起來象下面的樣子:
using System;
namespace NHibernate.Demo.QuickStart
{
public class User
{
private string id;
private string userName;
private string password;
private string emailAddress;
private DateTime lastLogon;
public User()
{
}
public string Id
{
get { return id; }
set { id = value; }
}
public string UserName
{
get { return userName; }
set { userName = value; }
}
public string Password
{
get { return password; }
set { password = value; }
}
public string EmailAddress
{
get { return emailAddress; }
set { emailAddress = value; }
}
public DateTime LastLogon
{
get { return lastLogon; }
set { lastLogon = value; }
}
}
}
在上面的例子里,我們的屬性和構建函數 是public,但這個對NHibernate不是必要的.它可以使用public, protected, internal或者甚至是用private來持久化數據。
第三步:寫映射文件
現在我們有數據表和需要去映射它的.Net類。我們需要一種方式去讓NHibernate知道如何從一個映射到另一個。這個任務依賴於映射文件來完成。最易於管理的辦法是為每一個類寫一個映射文件,如果你命名它是YourObject.hbm.xml 並且把它放在和類的同一個目錄里,NHiberante將會使得事情簡單起來。下面是一個User.hbm.xml的例子:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples" table="users">
<id name="Id" column="LogonId" type="String" length="20">
<generator class="assigned" />
</id>
<property name="UserName" column= "Name" type="String" length="40"/>
<property name="Password" type="String" length="20"/>
<property name="EmailAddress" type="String" length="40"/>
<property name="LastLogon" type="DateTime"/>
</class>
</hibernate-mapping>
讓我們來看看這個文件中讓我們感興趣的某些行。第一個有趣的標簽是class。這里我們將映射類型名稱(類名和裝配件)到我們資料庫中的User表,這里和Hibernate有一點點的不同。你將不得不告訴NHibernate從何處提取對象。在這個例子里我們從裝配件NHibernate.Examples裝載類NHibernate.Examples.QuickStart.User 。NHibernate 遵循和.Net Framework同樣的規則來載入類型。因此如果你在如何指定類型的方面有些混淆,請參看.Net Framework SDK。
讓我們先跳過id標簽,來討論property標簽。簡要看一下,你將發現NHibernate所要做的工作。name屬性的值正是我們.Net 類的屬性,column屬性值將是我們資料庫里的欄位。type屬性是可選的(如果你不標明,NHibernate將利用反射進行最佳的推測)。
好了,讓我們回到標簽id, 你可以猜測到這個標簽將是映射資料庫表的主鍵,的確如此,id標簽的組成和我們剛才看的property標簽是相似的。我們映射屬性到目標資料庫的欄位。
內嵌的generator 標簽告訴NHibernate 如何生成主鍵(它將恰當的為你生成主鍵,不管你指定何種類型,但你必須告訴它)。在我們的例子里,我們設定為assigned,意味著我們對象將自己生成主鍵(畢竟User對象常常需要一個UserID)。如果你執意要NHiberante為你生成主鍵,你感興趣於設定uuid.hex和uuid.string(從文檔中獲取更多信息)
提示:如果你使用Visual Studio.Net 去編譯的話,請將user.hbm.xml的Build Action屬性設置為Embedded Resource。映射文件將成為裝配件的一部分。更詳細的細節重點將在後面展示。
提示:如果你僅僅是改變映射文件,你不能使用build 而應該Rebuild項目。Visual Studio.Net 不會重新編譯有改變的映射文件。
第四步:為你的資料庫產生一個配置文件
我們至今還沒有告訴NHibernate 去哪裡連接資料庫。最直接的辦法是在你的應用程序的配置文件里設置一個NHibernate配置節。這和在Hibernate里使用屬性文件是等價的。如下配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<nhibernate>
<add
key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"
/>
<add
key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2000Dialect"
/>
<add
key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"
/>
<add
key="hibernate.connection.connection_string"
value="Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI"
/>
</nhibernate>
</configuration>
上面的例子里用了SqlClient 驅動,在本地連接名稱為NHibernate 的資料庫,提供用戶名和密碼。那裡有一堆屬性你需要調整來確定如何讓NHibernate來訪問資料庫。再次說明,你可以在文檔里獲取更多信息。
請注意以上的配置里並沒有涉及到log4net的配置信息。NHibernate使用log4net來記錄內部發生的一切。在一個應用程序產品里,在你特定環境里,我推薦配置log4net,並為NHibernate設置一定的日誌級別。
第五步:開始展現NHibernate的魔力
所有艱苦的工作已經完成。你將有以下內容
User.cs ----你需要持久化的C#類
User.hbm.xml ----你的NHibernate映射文件
App.config ---對ADO.NET連接的配置信息(如果你願意,你可以在代碼中實現)。
你的資料庫里有一張User表。
現在可以在你的代碼中恰當簡潔的使用NHibernate。簡化的版本如下
創建一個Configuration對象
讓Configuration知道你將存儲何種類型的對象
為你選擇的資料庫創建一個Session對象
Load,Save和Query你的對象
通過Session的Flush()方法將對象提交給資料庫。
為了讓你更清晰,我們來看一些代碼。
首先,創建一個Configuration對象
Configuration對象能夠解析所有.Net對象和後台資料庫中的映射關系。
Configuration cfg = new Configuration();
cfg.AddAssembly("NHibernate.Examples");
Configuration對象會搜索裝配件里的任何以hbm.xml 結尾的文件。還有其他方法載入映射文件,但這種方式是最簡單的。
下一步,創建一個Session對象
ISession對象提供一個到後台資料庫的連接,ITransaction對象提供一個可以被NHibernate管理的事務。
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
接著來Load, Save和Query你的對象
現在你可以用使用傳統的.Net方法來操縱對象。你想保存一個新對象到資料庫嗎?嘗試下面的方法:
User newUser = new User();
newUser.Id = "joe_cool";
newUser.UserName = "Joseph Cool";
newUser.Password = "abc123";
newUser.EmailAddress = "[email protected]";
newUser.LastLogon = DateTime.Now;
// Tell NHibernate that this object should be saved
session.Save(newUser);
// commit all of the changes to the DB and close the ISession
transaction.Commit();
session.Close();
正如你所看到的,關於NHiberante重要的事情是如此簡單。繼續並且查詢你的資料庫,驗證一下User表裡的新記錄。現在重要的事情就是你去操心業務對象並在進行處理的時候告訴NHibernate就可以了。
讓我們來告訴你,當你有一個UserID的時候如何獲取對象(舉例說,登陸你的網站的時候)。僅僅一句話就可以打開Session,傳入key就可以了
// open another session to retrieve the just inserted user
session = factory.OpenSession();
User joeCool = (User)session.Load(typeof(User), "joe_cool");
你所獲取的User對象還在生存周期內!改變它的屬性,並通過Flush()持久化到資料庫。
// set Joe Cool』s Last Login property
joeCool.LastLogon = DateTime.Now;
// flush the changes from the Session to the Database
session.Flush();
你所要做的就是通過NHibernate來進行你需要的改變,並調用Session的Flush()方法提交。驗證一下資料庫,查查用戶ID為」joe_cool」的記錄中」LastLogon」的更改。
還有更好的,你可以以System.Collections.IList的方式來獲取從表中的對象。如下
IList userList = session.CreateCriteria(typeof(User)).List();
foreach(User user in userList)
{
System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
}
這個查詢將會返回所有表記錄。往往你需要做更多的控制,比如說獲取從March 14, 2004 10:00 PM 以後登陸的用戶,如下:
IList recentUsers = session.CreateCriteria(typeof(User))
.Add(Expression.Expression.Gt("LastLogon", new DateTime(2004, 03, 14, 20, 0, 0)))
.List();
foreach(User user in recentUsers)
{
System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
}
文檔里還有一堆健壯的查詢方式讓你調用,這里僅僅讓你對NHibernate所提供的強有力的工具有一定的了解。
最後調用Session對象的Close()方法,釋放NHibernate所使用的ADO.Net連接資源
// tell NHibernate to close this Session
session.Close();
更確切地說…
你已經完成創建對象,持久化並通過條件查詢或鍵值查詢來返回它。相信你已經從中獲得快樂。
現在你對NHibernate有了大致的了解,如果你能仔細閱讀大量來自Hibernate 2.0.3文檔,你將獲得幫助(NHibernate文檔還在早期階段,現在還僅僅是對Hibernate的拷貝)。
Enjoy! And Happy NHibernating!
Mike Doerfler
㈧ NHibernate 連接多資料庫怎麼配置
sqlserver資料庫連接放在配置文件中,只是針對外部程序訪問sqlserver的場景,幾種不同連接方式(odbc,ef,nhibernate,mybitas,等等),連接字元串也有所不同,你在網上搜一下,sqlserver連接字元串格式就知道了,配信源者置文件的話,分2種,一種是建立項目時自帶的config文件,這種文件的讀滑薯寫訪問.net自己就有方法支持,文件格式和對應節點的說明也很詳細;自己建立一個配置文件(可以是txt,xml等,格式可以自己控制,不過需要自己去編寫相應的讀寫方法);
上面2種方式,各有優劣,第1種,使用系統自帶的配置文件,操作方便,但是這個文件有個要注意的地方,就是它一般是在系統啟動時去載入文件信息,在程序運行過程中,修改了配置文件的值,需要下次重啟軟體才會生效。
不過一般資料庫連接字元串這種,在程序運行過程中,變化的幾率小裂友,直接用自帶config文件就可以滿足需求
㈨ nhibernate這一ORM框架怎麼樣性能如何
NET 下 ORM 要死絕了。 真的。EF一出,幾全洞如死絕了。
Mybatis 已經放棄治 上次更新是2011年的事了
NBEAR 主頁打不開。
SubSonic-3.0 號稱也能Linq 查詢了。但是沒看出牛B的地方。主頁塵顫察文檔打不開。
你不用EF 只能用NH了
NH有口氣。 還在更新。 可是相當於沒有文檔…… 查文檔? 去Hibernate里找。找到回來猜
文檔寫的能把你的鼻子氣掉了。
優點
對各資料庫的抽象能力好。SQL方言這個設計真好。我喜歡
映射能力強 。支持各種奇葩的映射關系…… (我感覺用處不大)
支持2級緩存派茄 。 這個。EF 有個山寨的。但是官方沒有。這個絕對有用
支持一大堆奇葩的查詢方式。 感覺沒用,有linq 就好。NH也支持Linq
缺點
代碼歷史包袱重。
Java氣味大
據說沒有EF快。我看代碼也感覺是這樣的。但是開啟2緩,我感覺會快