當前位置:首頁 » 硬碟大全 » entityframework二級緩存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

entityframework二級緩存

發布時間: 2022-01-15 05:03:01

1. Entity Framework安裝,只能安裝最新版本,不能安裝就舊版本嗎

正在安裝 'EntityFramework 5.0.0'。
您即將從 Microsoft 下載 EntityFramework,您可以在 http://go.microsoft.com/fwlink/?LinkId=253898&clcid=0x409 取得它的授權合約。請檢查套件是否有其他相依項目,這些相依性可能隨附自己的授權合約。只要使用套件及其相依項目,即表示您接受其授權合約。如果您不接受授權合約,請將相關元件從您的裝置中刪除。
已經成功安裝 'EntityFramework 5.0.0'。
安裝失敗。正在復原...
Install-Package : 更新 'EntityFramework 6.0.2' 至 'EntityFramework 5.0.0' 失敗。找不到與 'EntityFramework 5.0
.0' 相容的 'EntityFramework.zh-Hans' 版本。
位於 行:1 字元:16
+ Install-Package <<<< EntityFramework -Version 5.0.0
+ CategoryInfo : NotSpecified: (:) [Install-Package], InvalidOperationException
+ FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPacka
geCommand

2. Entity Framework遷移不會造成混亂和數據丟失嗎

注意事項如下:
1. 分頁的時候,盡量在資料庫裡面去分頁.
2. 盡量禁用延遲載入,盡量使用預載入和顯式載入查詢.
如果啟用延遲載入,這樣會造成多次往返資料庫查詢的.勢必造成性能低下.
3. 注意事務的簡短性.
在使用事務時,要盡量把查詢語句或者其他響事務外的語句移在事務外執行.不然讓一個事務的時間太長了,就容易引起資源死鎖的問題.

4. 查詢出來的實體,如果不考慮刪除和修改,請用notracking
5. 批量刪除和修改,不要用先把實體查詢出來,然後再逐個刪除和修改.這樣會產生大量的語句,效率肯定會低.
6. 使用已編譯的查詢,雖然到ef5.0, linq 查詢是自動緩存的.但使用編譯查詢會比自動緩存的效率高.
7. 對於復雜的查詢,要隨時監控生成的查詢語句.
畢竟ef生成的語句,往往比生成的語句更加復雜,這個時候就要考慮是否通過其他方式來提高性能.

3. hibernate二級緩存 和 spring整合的緩存(就是用哪個Cacheable註解的)有什麼區別么

二級緩存配置(spring+hibernate)

說明:本人不建議使用查詢緩存,因為查詢緩存要求完全相同的查詢sql語句才會起作用,所說的查詢緩存是針對第二次查詢時 sql語句與第一次sql語句完全相同 那麼就可以從緩存中取數據而不去資料庫中取數據了,在不啟用查詢緩存的情況下 每次的查詢數據也會緩存到二級緩存的 只不過每次查詢都會去查詢資料庫(不包括根據ID查詢),啟用查詢緩存很麻煩 需要每次查詢時 調用Query.setCacheable(true)方法才可以,如:List<OrgiData> orgiDatas = (List<OrgiData>) s.createQuery("from OrgiData").setCacheable(true).list();

因此建議將查詢緩存設置為如下:
hibernate.cache.use_query_cache=false

還有就是最重要的一點:對於經常修改或重要的數據不宜進行緩存,因為多並發時會造成數據不同步的情況。

首先增加ehcache-1.4.1.jar和backport-util-concurrent-3.1.jar或oscache-2.1.jar

一、spring配置

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>com/handpay/core/merchant/bean/MerchGroupBuy.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.hbm2ddl.auto=update
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=false
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider </value>
</property>
</bean>

<!---紅色字體是二級緩存相關的設置->

二、hbm.xml文件示例

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.handpay.core.merchant.bean">
<class name="MerchGroupBuy" table="merch_group_buy">
<cache usage="read-write" region="com.handpay.core.merchant.bean.MerchGroupBuy"/>
<id name="id">
<generator class="native" />
</id>
<property name="code" />
<property name="createTime"/>
<property name="minNum"/>
<property name="status">
</property>
<property name="title"/>
<property name="typeCode"/>
<property name="updateTime"/>
</class>
</hibernate-mapping>

三、註解示例

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "alcor_t_countries", catalog = "alcorweb")
public class AlcorTCountries implements java.io.Serializable{。。。。}

四、配置文件參數詳解

ehcache.xml是ehcache的配置文件,並且存放在應用的classpath中。下面是對該XML文件中的一些元素及其屬性的相關說明:

<diskStore>元素:指定一個文件目錄,當EHCache把數據寫到硬碟上時,將把數據寫到這個文件目錄下。 下面的參數這樣解釋:

user.home – 用戶主目錄

user.dir – 用戶當前工作目錄

java.io.tmpdir – 默認臨時文件路徑

<defaultCache>元素:設定緩存的默認數據過期策略。

<cache>元素:設定具體的命名緩存的數據過期策略。

<cache>元素的屬性

name:緩存名稱。通常為緩存對象的類名(非嚴格標准)。

maxElementsInMemory:設置基於內存的緩存可存放對象的最大數目。

maxElementsOnDisk:設置基於硬碟的緩存可存放對象的最大數目。

eternal:如果為true,表示對象永遠不會過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認為false;

timeToIdleSeconds: 設定允許對象處於空閑狀態的最長時間,以秒為單位。當對象自從最近一次被訪問後,如果處於空閑狀態的時間超過了timeToIdleSeconds屬性值,這個對象就會過期。當對象過期,EHCache將把它從緩存中清空。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地處於空閑狀態。

timeToLiveSeconds:設定對象允許存在於緩存中的最長時間,以秒為單位。當對象自從被存放到緩存中後,如果處於緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過期。當對象過期,EHCache將把它從緩存中清除。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地存在於緩存中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,才有意義。

overflowToDisk:如果為true,表示當基於內存的緩存中的對象數目達到了maxElementsInMemory界限後,會把益出的對象寫到基於硬碟的緩存中。注意:如果緩存的對象要寫入到硬碟中的話,則該對象必須實現了Serializable介面才行。

memoryStoreEvictionPolicy:緩存對象清除策略。有三種:

1 FIFO ,first in first out ,這個是大家最熟的,先進先出,不多講了

2 LFU , Less Frequently Used ,就是上面例子中使用的策略,直白一點就是講一直以來最少被使用的。如上面所講,緩存的元素有一個hit 屬性,hit 值最小的將會被清出緩存。

2 LRU ,Least Recently Used ,最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那麼現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。

五 、查看 二級緩存數據

1、使用sessionFactory直接獲取
Map cacheEntries = sessionFactory().getStatistics()
.getSecondLevelCacheStatistics("cacheRegionName")
.getEntries();

其中 cacheRegionName 既是 ehcache.xml配置中的<cache 標簽的name屬性值

2、讓log4j列印緩存信息(生成環境下請注釋掉,以免影響性能)
log4j.logger.org.hibernate.cache=debug

4. entityframework where方法里的字元串比較怎麼寫

那個 提示下 Linq本身 確實可以實現 sql select... where in 操作 但是好像效率不太好
我個人排斥
直接給出答案
折集合對象 class myitem {
int id;
string name;‍

}
var myitemcollection = new myitem[]{ ....... };
//要找出 id 等於 1 ,2,3,4的元素(select * from T where id in(1,2,3,4));
int[] tosearch = new int[] { 1, 2, 3, 4 };
myitemcollection.where(s=>tosearch.Contains(s.id));// 就是你要的結果了

還有個偷巧的方法
如果你用 EntityFramework的話, 形如 dbcontextentities.myitemset.SQL(""); 逗地為sql原生語句,可以直接返回。。。。。 如果覺得實在想不出來linq怎麼寫的話

5. Entity Framework和ADO.Net兩個怎麼取捨

這個沒什麼不好取捨的,ado.net是Entity Framework的基礎,但不一定要用到項目中,如果你要學習,先學ado.net,在學Entity Framework比較好,在.net開發中,所有的orm都是基於ado.net的,所以,學就對了。
至於使用方面,還得看你想不想提高效率,Entity Framework開發效率很高的,就是用不好會很慢,學習起來也慢。

6. Entity Framework於ADO.Net相比有什麼優勢

快速開發,大大的減少了代碼量。不用定義實體類那些東西了。直接與資料庫中模型結合起來了,我也只知道一點,用過一點。很好學的,不過得先學LINQ哦。

7. 如何使用entityframework

先簡單說一下如何創建環境。如果你對這些步驟了如指掌,請直接跳過。

1. 在Visual Studio中創建一個示例工程。最簡單的莫過於ConsoleApplication

2. 在工程中添加ADO.NET Entity Data Model。

選擇其中的兩個表作為示例,表Teacher和表Course

添加edmx之後,Visual
Studio為自動幫我們生成/添加所有需要的文件和內容,然後我們就可以開始在代碼中操作資料庫了。來看看在EF中幾種不同的數據載入方式。

惰性載入(Lazy Loading)

默認情況下,EF會使用惰性載入方式載入數據,即ctx.Configuration.LazyLoadingEnabled = true;
在下面的代碼中,外層循環會執行一次查詢,並將返回的結果存放在變數q中。而內層循環會在每一次循環過程中獨立進行查詢,所以,如果資料庫表Teacher中有100條記錄而Course有1000條記錄,那麼整個過程將產生1001次查詢。

using (var ctx = new SchoolDBEntities())
{
var q = from t in ctx.Teachers
select t;

foreach (var teacher in q)
{
Console.WriteLine("Teacher : {0}", teacher.TeacherName);
Console.WriteLine("Respective Courses...");

foreach (var course in teacher.Courses)
{
Console.WriteLine("Course name : {0}", course.CourseName);
}

Console.WriteLine();
Console.ReadKey();
}
}

8. c#怎麼使用entityframework6連接sql server

private static string conStr =「」;//鏈接字元串
using (SqlConnection sqlCon = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sqlStr, sqlCon))//sqlstr 是sql語句
{

if (sq != null)
{
cmd.Parameters.AddRange(sq);
}
//打開連接
sqlCon.Open();
return cmd.ExecuteNonQuery();
}
}
可以進行增刪改查

9. 什麼是Entity Framework

Entity Framework主要是把關系型資料庫也就是Sqlserver那些轉化一下,讓程序員在寫C#的代碼的時候,能用類的方式來操作資料庫,而不是用sql字元串。

我們可以把它用用C/S的工程當中,也可以把它用到 B/S的工程當中。為了展示EntityFramework的使用方法,我們首先得建立一個例子解決方案。這個解決方案的最基礎的普通三層結構,因為數據的訪問主要靠EntityFramework來實現,所以數據訪問層的實現基本看不出來了,使得整個解決方案好像就是個兩層的一樣。