再现理想 发表于 2015-1-18 11:28:39

ASP.NET网页设计负载平衡情况下,Web使用的缓存办理仓酷云

因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似net网页编程那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。今朝正在做的一个Web使用,是做了负载平衡的。在使用中,对某些实体数据做了Memory级其余缓存处置,以削减数据库会见次数,进步功能。缓存的完成是接纳Asp.net2.0的System.Web.Caching定名空间中的类。实体数据在某些情形下会有变动,以是必要对缓存举行处置,或扫除或同步。在这类情形下发生了一个成绩:实体数据产生变动以后,怎样关照到背景的N多个Web使用中的缓存?上面办法是做的一些实验。1.接纳服务的体例
这是一种最间接的体例。固然服务的体例能够多种多样,对照复杂的体例是供应一个ClearCache.aspx的页面,当实体数据产生变动以后挪用N多台Web应当的这个页面。
2.接纳FileDependency的战略
这类战略让缓存依附于一个指定的文件,经由过程改动文件的更新日期来扫除缓存。这类体例的弱点是,假如缓存的数据对照多,相干的依附文件对照松懈,对办理这些依附文件有必定的贫苦。关于负载平衡情况下,还必要同时更新多台Web服务器下的缓存文件,假如多个Web使用中的缓存依附于统一个共享的文件,大概会免却这个贫苦,可是对Web使用中运转帐号的权限所限,终回不是那末简便。


<br>
<br>Code

<br>HttpRuntime.Cache.Add(

<br>"Key1",

<br>newCacheDependency("C:        est.txt"),

<br>System.Web.Caching.Cache.NoAbsoluteExpiration,

<br>System.Web.Caching.Cache.NoSlidingExpiration,

<br>CacheItemPriority.Default,

<br>null

<br>);
3.接纳SqlCacheDependency的战略
这类战略让缓存依附与数据库中指定的数据(查询了局)。能够用Poll的体例自动挪用,设定一个周期,轮回挪用查询语句,假如查询了局产生变更,就会扫除缓存。也能够共同SqlServer2005,接纳Push的体例主动的被关照甚么时分会分明缓存。这类Push的体例是基于SqlServer2005中BrokerService的定阅服务,SqlCacheDependency必要共同SqlDependency来完成这类体例。

Code

<br>usingSystem;

<br>usingSystem.Collections;

<br>usingSystem.Web;

<br>usingSystem.Web.Caching;

<br>usingSystem.Net;

<br>usingSystem.IO;

<br>usingSystem.Data;

<br>usingSystem.Data.SqlClient;

<br>usingSystem.Configuration;

<br>

<br>namespaceCacheManagement

<br>{

<br>publicinterfaceIWebCache

<br>
<br>
<br>{

<br>voidAdd(stringkey,objectvalue);

<br>objectGet(stringkey);

<br>voidRemove(stringkey,booluseDependency);

<br>}

<br>

<br>publicclassWebCacheBase:IWebCache

<br>{

<br>protectedboolCheckParameters(stringkey)

<br>{

<br>return!string.IsNullOrEmpty(key);

<br>}

<br>

<br>protectedvirtualCacheDependencyGetCacheDependency(stringkey)

<br>{

<br>returnnull;

<br>}

<br>

<br>protectedvirtualvoidOnBeforeAdd(stringkey)

<br>{

<br>}

<br>

<br>publicvirtualvoidAdd(stringkey,objectvalue)

<br>{

<br>if(!this.CheckParameters(key))return;

<br>this.OnBeforeAdd(key);

<br>HttpRuntime.Cache.Insert(

<br>key,

<br>value,

<br>this.GetCacheDependency(key),

<br>System.Web.Caching.Cache.NoAbsoluteExpiration,

<br>System.Web.Caching.Cache.NoSlidingExpiration,

<br>System.Web.Caching.CacheItemPriority.Default,

<br>null);

<br>}

<br>

<br>publicvirtualobjectGet(stringkey)

<br>{

<br>if(!this.CheckParameters(key))returnnull;

<br>returnHttpRuntime.Cache.Get(key);

<br>}

<br>

<br>publicvirtualvoidRemove(stringkey,booluseDependency)

<br>{

<br>if(!this.CheckParameters(key))return;

<br>HttpRuntime.Cache.Remove(key);

<br>}

<br>}

<br>

<br>publicclassSqlDependencyWebCache:WebCacheBase

<br>{

<br>privatestring_connectionString;

<br>

<br>privateSqlConnectionGetConnection()

<br>{

<br>returnnewSqlConnection(this._connectionString);

<br>}

<br>

<br>privateSqlCommandGetSelectCommand(stringkey)

<br>{

<br>SqlConnectionconn=this.GetConnection();

<br>SqlCommandcmd=newSqlCommand();

<br>cmd.Connection=conn;

<br>cmd.CommandType=CommandType.Text;

<br>cmd.CommandText="selectFlagfromdbo.CacheDependencywhereCacheKey=@CacheKey";

<br>SqlParametersqlParam=cmd.Parameters.Add("@CacheKey",SqlDbType.VarChar,50);

<br>sqlParam.Value=key;

<br>returncmd;

<br>}

<br>

<br>privateSqlCommandGetUpdateCommand(stringkey)

<br>{

<br>SqlConnectionconn=this.GetConnection();

<br>SqlCommandcmd=newSqlCommand();

<br>cmd.Connection=conn;

<br>cmd.CommandType=CommandType.Text;

<br>cmd.CommandText=@"

<br>ifexists(select1fromdbo.CacheDependencywhereCacheKey=@CacheKey)

<br>updatedbo.CacheDependencysetFlag=casewhenisnull(flag,0)=0then1else1endwhereCacheKey=@CacheKey

<br>else

<br>insertintodbo.CacheDependency(CacheKey,Flag)

<br>values(@CacheKey,0)

<br>";

<br>SqlParametersqlParam=cmd.Parameters.Add("@CacheKey",SqlDbType.VarChar,50);

<br>sqlParam.Value=key;

<br>returncmd;

<br>}

<br>

<br>privatevoidUpdateCacheDependency(stringkey)

<br>{

<br>SqlCommandcmd=this.GetUpdateCommand(key);

<br>using(cmd.Connection)

<br>{

<br>cmd.Connection.Open();

<br>cmd.Prepare();

<br>cmd.ExecuteNonQuery();

<br>}

<br>}

<br>

<br>protectedoverridevoidOnBeforeAdd(stringkey)

<br>{

<br>this.UpdateCacheDependency(key);

<br>}

<br>

<br>protectedoverrideCacheDependencyGetCacheDependency(stringkey)

<br>{

<br>SqlCommandcmd=this.GetSelectCommand(key);

<br>SqlCacheDependencysqlCacheDependency=newSqlCacheDependency(cmd);

<br>using(cmd.Connection)

<br>{

<br>cmd.Connection.Open();

<br>cmd.Prepare();

<br>cmd.ExecuteNonQuery();

<br>}

<br>returnsqlCacheDependency;

<br>}

<br>

<br>publicSqlDependencyWebCache(stringconnectionString)

<br>{

<br>this._connectionString=connectionString;

<br>}

<br>

<br>publicoverridevoidRemove(stringkey,booluseDependency)

<br>{

<br>if(!this.CheckParameters(key))return;

<br>if(useDependency)

<br>{

<br>this.UpdateCacheDependency(key);

<br>}

<br>else

<br>{

<br>base.Remove(key,useDependency);

<br>}

<br>}

<br>}

<br>

<br>publicclassWebCacheFactory

<br>{

<br>publicstaticIWebCacheGetWebCache()

<br>{

<br>stringconnectionString=ConfigurationManager.AppSettings["ConnectionString"];

<br>returnnewSqlDependencyWebCache(connectionString);

<br>}

<br>}

<br>}

<br>Code

<br><%@ApplicationLanguage="C#"%>

<br>

<br><scriptrunat="server">

<br>

<br>privatestringGetConnectionString()

<br>{

<br>return"Server=.;UserID=sa;Password=sa;database=TestDB;ConnectionTimeout=30";

<br>}

<br>

<br>voidApplication_Start(objectsender,EventArgse)

<br>{

<br>System.Data.SqlClient.SqlDependency.Start(this.GetConnectionString());

<br>}

<br>

<br>voidApplication_End(objectsender,EventArgse)

<br>{

<br>System.Data.SqlClient.SqlDependency.Stop(this.GetConnectionString());

<br>}

<br>

<br></script>
注1:数据库中新建一个CacheDependency的表,主键为CacheKeyvarchar(50),另外一个字段为Flagbit。缓存项依附与CacheDependency中对应的一行。
注2:数据库中必要启动BrokerService。命令为:alterdatabasesetenable_broker(必要断开其他的数据库毗连)。
注3:在ApplicantionStart和End的时分必要开启和中断SqlDependency。
停止语:
缓存的完成除能够用Asp.net自带的Cache外,还能够用Entlib的CacheApplicationBlock,没有细心研讨过。以上的三种体例是参考网上N多资本和本人理论的了局。假如有倡议或有其他体例,接待盖楼。
来自:负载平衡情况下,Web使用的缓存办理
J2EE比较成熟一点,一些比较出名的企业应用软件都是基于J2EE的。以后的发展就不好说了。不过net网页编程比较烦,学.net的话,微软把很多工具都封装好了,学起来可能容易一点。

变相怪杰 发表于 2015-1-21 07:45:21

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

活着的死人 发表于 2015-1-30 11:42:11

可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。

山那边是海 发表于 2015-2-6 10:59:16

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

精灵巫婆 发表于 2015-2-16 00:31:41

比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。

兰色精灵 发表于 2015-2-24 02:23:59

HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.

老尸 发表于 2015-3-6 04:57:56

ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。

金色的骷髅 发表于 2015-3-12 20:49:19

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

不帅 发表于 2015-3-13 09:09:39

在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。

小魔女 发表于 2015-3-20 17:48:05

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

若相依 发表于 2015-4-16 09:10:44

虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。
页: [1]
查看完整版本: ASP.NET网页设计负载平衡情况下,Web使用的缓存办理仓酷云