二 .NET memcached client library
下载文件:https://sourceforge.net/projects/memcacheddotnet/
里面有.net1.1 和 .net2.0的两种版本 还有一个不错的例子。
九,Enterprise Library Caching Application Block缓存方式简析:
在Caching Application Block中,定义了两种缓存类型,它们分别是内存驻留型缓存和磁盘驻留型缓存。顾名思义,这两种类型的缓存是以存贮位置来命名的,功能上则以是否能将缓存数据持久化来区别使用。
在Caching Application Block中,具体提供以下四种保存缓存数据的途径,分别是:内存存储(默认)、独立存储(Isolated Storage)、数据库存储(DataBase Cache Storage)和自定义存储(Custom Cache Storage)。
1、内存存储:内存存储缓存是以上四种方式中唯一的内存驻留型缓存,也是我们开发中最常用到的一种途径,其响应速度快的优势是其它方式无法匹敌的,但单一得采用这种方式的话会有如下弊端:
1)缓存数据不能持久化,服务器重起后缓存数据会全部丢失。
2)服务器采用负载均衡时采用内存缓存的话,一定要保证多台服务器间的内存缓存状态同步,但这样做会对IO造成较大压力,容易造成系统瓶颈,故,从系统性能和开发成本的角度讲,负载均衡的环境下不易单一的采用内存缓存。
2、独立缓存(Isolated Storage):Isolated Storage是缓存数据持久化的一种选择方式,它是磁盘驻留型缓存,如果您足够细心的话会在每一台机器上找到一个IsolatedStorage文件 夹;采用独立缓存的话,我们的缓存信息就会以二进制文件的形式就保存在这个文件夹中,如下是我所用的机器(Vista OS)上生成Cache数据后的缓存信息所在的具体目录:C:/Users/Jon/AppData/Local/IsolatedStorage/ ;
Caching Application Block没有为我们提供向指定机器读、写独立缓存的功能,因此,这种方式只适合需要缓存持久化和大数据量缓存的场合,并不适用于负载均衡的环境。
3、数据库存储(DataBase Cache Storage):如若想采用数据库存储缓存信息,首先第一步要建立缓存数据库Caching,在安装Enterprise Library后并未默认安装此数据库,若想安装,我们首先找到Enterprise Library的安装文件夹,会发现一个建立数据库的CreateCachingDb.cmd文件,执行该文件后您就会在您的SQL-Server上新建 一个名为Caching的数据库,该文件在4.1版中详细地址为:安装盘符:/安装目录/EnterpriseLibary/Blocks /Caching/Src/Database/Scripts/CreateCac控件gDb.cmd文件,在Caching数据库中只有一个 CacheData表,这个表就保存了我们所读写得缓存信息。
4、自定义存储(Custom Cache Storage):关于自定义存储并未深入研究,在此暂不详细讨论.
十、ibatis自带分页api有问题:主要是性能的问题
在ibatis中有一个很吸引人的方法,queryForPaginatedList(Java.lang.String id, int pageSize),可以返回 PaginatedList的对象,
实现翻页,刚才测试了一下PaginatedList,在1-2w行数据的时候还可以工作,但是在一个30w行的表里翻页,一次select用了363.031second
忍不住看了一下源,发现ibatis的分页依赖于数据库的jdbcDriver.
调用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()
分页处理的函数如下
Java代码
1. private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback); throws SQLException {
2. try {
3. request.setResultSet(rs);;
4. ResultMap resultMap = request.getResultMap();;
5. if (resultMap != null); {
6. // Skip Results
7. if (rs.getType(); != ResultSet.TYPE_FORWARD_ONLY); {
8. if (skipResults > 0); {
9. rs.absolute(skipResults);;
10. }
11. } else {
12. for (int i = 0; i < skipResults; i++); {
13. if (!rs.next();); {
14. return;
15. }
16. }
17. }
18.
19. // Get Results
20. int resultsFetched = 0;
21. while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults); && rs.next();); {
22. Object[] columnValues = resultMap.resolveSubMap(request, rs);.getResults(request, rs);;
23. callback.handleResultObject(request, columnValues, rs);;
24. resultsFetched++;
25. }
26. }
27. } finally {
28. request.setResultSet(null);;
29. }
30. }
private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback); throws SQLException {
try {
request.setResultSet(rs);;
ResultMap resultMap = request.getResultMap();;
if (resultMap != null); {
// Skip Results
if (rs.getType(); != ResultSet.TYPE_FORWARD_ONLY); {
if (skipResults > 0); {
rs.absolute(skipResults);;
}
} else {
for (int i = 0; i < skipResults; i++); {
if (!rs.next();); {
return;
}
}
}
// Get Results
int resultsFetched = 0;
while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults); && rs.next();); {
Object[] columnValues = resultMap.resolveSubMap(request, rs);.getResults(request, rs);;
callback.handleResultObject(request, columnValues, rs);;
resultsFetched++;
}
}
} finally {
request.setResultSet(null);;
}
}
返回的PaginatedList实际上是PaginatedDataList类的对象,每次翻页的时候最后都会调用
Java代码
1. private List getList(int idx, int localPageSize); throws SQLException {
2. return sqlMapExecutor.queryForList(statementName, parameterObject, (idx); * pageSize, localPageSize);;
3. }
private List getList(int idx, int localPageSize); throws SQLException {
return sqlMapExecutor.queryForList(statementName, parameterObject, (idx); * pageSize, localPageSize);;
}
这个方法,可见ibatis的分页机制要看jdbcDriver如何实现以及是否支持rs.absolute(skipResults)。
这种实现肯定不如数据库自己支持的分页方式来的快,一旦碰到数据量大的表,马上会死翘翘。
十一、ibatis调用存储过程的方法:
http://www.cnblogs.com/shineqiujuan/archive/2009/08/09/1542423.html
ibatis处理返回单个记录集的情况没有问题,但是对于多个记录集的情况ibatis接受的时候总是不成功
暂时的解决办法是:尽量让存储过程返回单个的实体集。
十二、ibatis传递集合对象的使用方法:
http://dev.firnow.com/course/1_web/JavaScript/jsjs/20090519/167364.html
十三、DBTimeStamp---》DateTime,在使用ibatis生成sql server数据库的实体对象时DateTime类型生成出错,手动更改成DateTime即可。
十四、ASP.NET后台代码调用前台javascript脚本的几种方法
很多人都向在服务器端调用客户端的函数来操作,也就是在asp中调用javascript脚本中已经定义好的脚本函数。经过研究,发现了一些勉强的方法。
1. 用Response.Write方法写入脚本
比如在你单击按钮后,先操作数据库,完了后显示已经完成,可以在最后想调用的地方写上
Response.Write("<script type='text/javascript'>alert();</script>");
这个方法有个缺陷就是不能调用脚本文件中的自定义的函数,只能调用内部函数,具体调用自定义的函数只能在Response.Write写上函数定义,比如Response.Write("<script type='text/javascript'>function myfun(){...}</script>");
2.用ClientScript类动态添加脚本
用法如下:在想调用某个javascript脚本函数的地方添加代码,注意要保证MyFun已经在脚本文件中定义过了。
ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>MyFun();</script>");
这个方法比Response.Write更方便一些,可以直接调用脚本文件中的自定义函数。
3.普通的添加控件的Attributes属性
对于普通按钮就是:Button1.Attributes.Add("onclick","MyFun();");
只能在Onload中或类似于onload的初始化过程中添加才有效。而且是先执行脚本函数,无法改变执行顺序。
注意,以上所有方法中,后台代码都不能有转化当前页的代码,比如Redirect等,要把转页代码放在脚本里面
十五,ibatis中模糊查询语法
<isNotEmpty prepend=" " property="Xm" xsi:type="VarChar">
and xm like '%$Xm$%'
</isNotEmpty>
十六、aspx.cs类文件需要主要的事项:
#region 字段及属性(字段及属性在每次请求相应之后会释放掉类文件,所以这里不应该暂存数据)
/// <summary>
/// 页面常用工具类
/// </summary>
internal Function fc = new Function();
#endregion
十六、aspx页面刷新的机制解释:
刷新是把之前的页面请求重新执行一次,如果上一个请求时load则重新执行一次load,如果上一个请求为提交事件则数据会被重新提交一次。
十七,web页面里不能嵌套form,会导致里提交不出去的的
十八,web一点提交会先执行一遍load方法再执行提交方法里的代码。
十九、ibaits中特殊字符的处理
iBATIS sql中的处理特殊符号的做法
1.做过html就知道,其实就是xml的特殊符号,需要做个转义
< <
> >
< <
> >
& &
' '
" "
2.建议使用<![CDATA[ ]]>符号进行统一说明,将此符号内的任何文本不进行解析
<![CDATA[ 这里写你的sql ]]>
3. 处理Like可以用下面的这两种方法
LIKE #param#||'%' 采li用字符串替换,就是替换参数的值替换param。
其实同理可以处理其它类似的问题。
二十,sqlmap里配置的设置,Ext**.xml 里如果启用了别名,在节点了要用这个别名。
二十一、asp.net程序,服务器端c#生成一张图片程序发布到iis后报错,原因是iis权限的问题,在站点上右键选择权限,点击添加按钮,输入"ev",确定后把everyone的权限设置成可读可写即可。
二十二、asp.net程序,C#写的一段导出到excel的程序,通过调用excel自身的com实现的,在vs下测试没有出现问题,但是一旦发布到iis里却会报错,原因也是权限的问题:具体解决办法如下:
检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。具体解决方法如下:1:在服务器上安装office的Excel软件.2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置"4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框5:点击"标识"标签,选择"交互式用户"6:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.7:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限.这样,我们便配置好了相应的Excel的DCOM权限.注意:这是在WIN2003上配置的,在2000上,可能是配置ASPNET用户由于EXCEL是在服务器上打开的,所以应该写一个把导出数据保存在服务器上,然后再传递给客户端的方法,最后每次调用这个功能的时候再删除以前在服务器上所生成的所有Excel
二十三:C#的TrimEnd方法的使用记录
// edited by luyongchao at 20110722 TrimStart 用法有误会
/*
* Trim("abcd".ToCharArray())就是删除字符串头部及尾部出现的a或b或c或d字符,删除的过程直到碰到一个既不是a也不是b也不是c也不是d的字符才结束。
* 这里最容易引起的误会就是以为删除的是"abcd"字符串。如下例:
* string s = " from dual union all ";
s = s.Trim().TrimEnd("union all".ToCharArray());
可能有人以为上面s的最终结果是"from dual",但真正的结果是"from d"。需要注意的是这种写法执行的删除对象是字符数组中出现的任意字符,而不是这些字符连在一起组成的字符串!
*/
二十四:js下控制textbox控件的可用性:
var RadioButtonDefault = document.getElementById('RadioButtonDefault');
var TextBoxJYL = document.getElementById('TextBoxJYL');
if(RadioButtonDefault.check==false)
{
TextBoxJYL.removeAttribute("disabled");
}
else {
TextBoxJYL.setAttribute("disabled","true");
}
二十五:web里userControl跟主页面可以通过事件的调用来交互:
MyUserControl myUserControl = LoadControl("MyUserControl.ascx") as MyUserControl;
if (myUserControl != null)
{
myUserControl.MyEvent += new MyUserControl.MyEventHandler(userControlBtnClick);
this.PlaceHolder1.Controls.Add(myUserControl);
}
二十六:web页面校验有两种CSASPNETPageValidationClientSide.aspx、CSASPNETPageValidationServerSide.aspx,
<asp:Label ID="lbl_email" runat="server" Text="Your current email address:"></asp:Label>
<asp:TextBox ID="tb_email" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="tb_email"
ErrorMessage="Required field cannot be left blank." Display="Dynamic" ></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="Invalid email address."
ControlToValidate="tb_email" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"
Display="Dynamic"></asp:RegularExpressionValidator>
Use:
The sample demonstrates how to use ASP.NET validation control.
There are two ways to use ASP.NET validation controls: Server-side or
Client-side. The client side validation has greater performance, because it
does not do some postback. If clients do not support client-side validation,
we can use the server side validation instead.
二十七:asp.net的导入导出功能代码
导出
using (OleDbConnection conn = new OleDbConnection("excel路径"))
{
// Create a new sheet in the Excel spreadsheet.
OleDbCommand cmd = new OleDbCommand("create table Person(LastName varchar(50), FirstName varchar(50),PersonCategory varchar(50))", conn);
// Open the connection.
conn.Open(); //一open就会创建一个excel文件
// Execute the OleDbCommand.
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO Person (LastName, FirstName,PersonCategory) values (?,?,?)";
// Add the parameters.
cmd.Parameters.Add("LastName", OleDbType.VarChar, 50, "LastName");
cmd.Parameters.Add("FirstName", OleDbType.VarChar, 50, "FirstName");
cmd.Parameters.Add("PersonCategory", OleDbType.VarChar, 50, "PersonCategory");
// Initialize an OleDBDataAdapter object.
OleDbDataAdapter da = new OleDbDataAdapter("select * from Person", conn);
// Set the InsertCommand of OleDbDataAdapter,
// which is used to insert data.
da.InsertCommand = cmd;
// Changes the Rowstate()of each DataRow to Added,
// so that OleDbDataAdapter will insert the rows.
foreach (DataRow dr in dtSQL.Rows)
{
dr.SetAdded();
}
// Insert the data into the Excel spreadsheet.
da.Update(dtSQL);
}
二十八:.net异常的处理:
Good:
// C# sample:
try
{
... // Do some reading with the file
}
catch
{
file.Position = position; // Unwind on failure
throw; // Rethrow 这里需要注意不要写成throw ex;仅仅写throw; 可以保证异常stack不丢失
}
二十九:微软企业类库5.0简介:
微软Pattern&Practices小组日前发布了 Enterprise Library 5.0,这是一套应用程序模块,可以用来为企业应用程序构建模块,它是微软关于如何编写良好的应用程序的指导。该类库包含了大量的改善,包括Unity 2.0,以及对.NET 4.0的支持。
Microsoft Enterprise Library 5.0包含了能够用于为企业应用构建应用程序模块的源代码。这些代码可以直接使用,也可以根据需要进行修改或者扩展。这套类库的主要目的是为开发者提供如何编写良好代码的指导。类库使用像插件和依赖注入等设计模式构建,公用的功能被封装在Enterprise Library Core中,它使用统一的协定进行命名和设定版本,所有的应用模块都经过了检测,并且从最初的设计阶段开始就在其中包含了单元测试。
The Enterprise Library contains the following application blocks:
Enterprise Library中包含了下列应用程序模块:
缓存——通过内存或者数据库中的存储提供本地缓存
加密——为多家提供商的加密方案提供了支持
数据访问——为最常用的ADO.NET特性——像存储过程、嵌入式的SQL命令、管理连接、缓存参数——提供支持。
异常处理——提供了很多处理器,用来处理最一般的异常:包装、替换、记录日志、错误契约(WCF)等等。
日志——帮助我们处理日志信息的格式,并且提供了各种各样的方式来记录日志:事件、email、数据库、消息队列、文本文件、WMI、自定义方式等等、
策略注入——帮助我们基于交叉关系为对象的行为发出警告。它是构建在DI容器Unity之上的。
安全——帮助开发者处理授权和认证的问题。
验证——对来自于其他用户或者系统的输入的验证提供支持。是用来验证实体不是用来验证ui的
Unity依赖注入和侦听——它是依赖注入的容器,最初是独立发布的(1.0),现在对其进行了改善并包含在这个库中。
针对上个版本,此版本的企业库所做的改善有:
从架构上对其进行了重构,从而得到更好的可测试性和可维护性。
它包含了Unity,这是一个DI容器,可以由用户选择另外的容器来替换。
支持编程式的配置
拥有异步的数据访问机制
合并了WPF的验证机制
更好的日志记录性能
支持.NET 4.0
企业库可以用在32位和64位的计算机上,但是没有在Windows XP上测试通过,并且在它所支持的操作系统的列表中也没有提到XP。尽管如此,Grigori Melnik 并没有发现不能在XP上基于.NET 3.5或者.NET 4.0使用此类库的原因。
Melnik 还提到pattern & practices团队试图与之前的版本保持兼容,但是还是存在一些不兼容的变更。
三十:jQuery
vs 下jquery是可以有智能提示的 大体是要把jquery-1.4.1-vsdoc.js配置到Site.Master里面去
三十一:
三十二:vs2008下开启视警告为错误,可以完成一些代码校验的工作,举一个应用场景:“public方法没有xml的注释”,这个方法太有用了,哈哈。
在项目通过使用了警告即错误的方式达在一定程度上达到了控制代码质量的目的,需要设置三个地方:
“项目属性---》生成---》降警告视为错误(选择'全部'或者'特定警告')”
“项目属性---》生成---》输出(Xml文档文件要打上对勾)”
“项目属性---》代码分析--》第一项(生成时启用代码分析)不打勾,第二项(禁止显示所生成代码的结果)打勾;在设置list里自己需要检 测的代码规则”
三十三:解决方案文件夹的使用
step1:修改sln文件,使得解决方案里可以看到文件夹
step2:右键添加已有项点击"选择项",把dll添加进来
step3:各个项目从统一的地方添加应用
三十四:使用spring.web可以不用每个页面都添加一段脚本,可以添加到web.config里
<pages theme="Spring">
<controls>
<add tagPrefix="spring" namespace="Spring.Web.UI.Ckey });
mbly="Spring.Web"/>
</controls>
</pages>
三十五:spring.net.dao 配置文件中 dao.xml及server.xml中节点对应关系是不区分大小写的
三十六:spring可以适用编程的方式实现回滚:
14.6. 编程方式的事务管理
Spring.NET提供了两种方法来进行编程式事务管理:
使用TransactionTemplate类
直接使用IPlatformTransactionManager的实现类
如果您要使用编程方式进行事务管理,Spring团队推荐使用第一种方式(即使用TransactionTemplate类)。
14.6.1. 使用TransactionTemplate
TransactionTemplate的工作方式与Spring.NET的其它模板类如AdoTemplate和HibernateTemplate相同。它使用回调方法将应用程序的代码从样板式的准备工作和资源管理中解放出来。如果使用System.Transaction的话就必须自己处理这些烦人的工作。使用TransactionTemplate时,提交是默认的行为,异常则会触发自动回滚,不需要使用TransactionScope来手工的进行提交或回滚。
同Spring.NET中其它模板类一样,TransactionTemplate的对象是线程安全的。
如果需要在事务环境中执行,应用程序必须使用如下的代码。注意ITransactionCallback可以用来返回某个值:
TransactionTemplate tt = new TransactionTemplate(TransactionManager);
string userId = "Stewie";
object result = tt.Execute(delegate {
dao.UpdateOperation(userId);
return dao.UpdateOperation2();
});