当前位置:首页 » 硬盘大全 » 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来实现,所以数据访问层的实现基本看不出来了,使得整个解决方案好像就是个两层的一样。