??xml version="1.0" encoding="utf-8" standalone="yes"?>两个人hd高清在线观看,欧美日韩精品一区二区三区在线观看 ,黄色在线视频观看网站http://www.aygfsteel.com/aichan/category/8882.htmlzh-cnFri, 02 Mar 2007 05:01:50 GMTFri, 02 Mar 2007 05:01:50 GMT60 Hibernate二~存ȝQ{载)http://www.aygfsteel.com/aichan/articles/63483.html艑ְ艑ְMon, 14 Aug 2006 07:11:00 GMThttp://www.aygfsteel.com/aichan/articles/63483.htmlhttp://www.aygfsteel.com/aichan/comments/63483.htmlhttp://www.aygfsteel.com/aichan/articles/63483.html#Feedback0http://www.aygfsteel.com/aichan/comments/commentRss/63483.htmlhttp://www.aygfsteel.com/aichan/services/trackbacks/63483.html作者:AreYouOk
文档来自Q?a >http://forum.javaeye.com/viewtopic.php?t=18904
很多人对二~存都不太了解,或者是有错误的认识Q我一直想写一文章介l一下hibernate的二U缓存的Q今天终于忍不住了?br />我的l验主要来自hibernate2.1版本Q基本原理和3.0?.1是一LQ请原谅我的固不化?br />
hibernate的session提供了一U缓存,每个sessionQ对同一个idq行两次loadQ不会发送两条sqll数据库Q但是session关闭的时候,一U缓存就失效了?br />
二~存是SessionFactoryU别的全局~存Q它底下可以使用不同的缓存类库,比如ehcache、oscache{,需要设|hibernate.cache.provider_classQ我们这里用ehcacheQ在2.1中就?br />hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
如果使用查询~存Q加?br />hibernate.cache.use_query_cache=true


~存可以单的看成一个MapQ通过key在缓存里面找value?br />
Class的缓?/span>
? 于一条记录,也就是一个PO来说Q是ҎID来找的,~存的key是IDQvalue是POJO。无论listQloadq是iterateQ只要读? 一个对象,都会填充~存。但是list不会使用~存Q而iterate会先取数据库select id出来Q然后一个id一个id的loadQ如果在~存里面有,׃~存取,没有的话去数据库load。假设是d~存Q需要设|:

如果你用的二~存实现是ehcache的话Q需要配|ehcache.xml

? 中eternal表示~存是不是永q不时QtimeToLiveSeconds是缓存中每个元素Q这里也是一个POJOQ的 时旉Q如果eternal="false"Q超q指定的旉Q这个元素就被移C。timeToIdleSeconds是发呆时_是可选的。当往~? 存里面put的元素超q?00个时Q如果overflowToDisk="true"Q就会把~存中的部分数据保存在硬盘上的时文仉面?br />每个需要缓存的class都要q样配置。如果你没有配置Qhibernate会在启动的时候警告你Q然后用defaultCache的配|,q样多个class会共享一个配|?br />当某个ID通过hibernate修改Ӟhibernate会知道,于是U除~存?br />q? 样大家可能会惻I同样的查询条ӞW一ơ先listQ第二次再iterateQ就可以使用到缓存了。实际上q是很难的,因ؓ你无法判断什么时候是W一ơ, 而且每次查询的条仉常是不一LQ假如数据库里面?00条记录,id??00Q第一ơlist的时候出了前50个idQ第二次iterate的时 候却查询?0?0号idQ那?0-50是从~存里面取的Q?1?0是从数据库取的,共发?+20条sql。所以我一直认为iterate没有什 么用QL会有1+N的问题?br />Q题外话Q有说法说大型查询用list会把整个l果集装入内存,很慢Q而iterate只select id比较好,但是大型查询L要分|的,谁也不会真的把整个结果集装进来,假如一?0条的话,iterate共需要执?1条语句,list虽然选择 若干字段Q比iterateW一条select id语句慢一些,但只有一条语句,不装入整个结果集hibernateq会Ҏ数据库方a做优化,比如使用mysql的limitQ整体看来应该还? list快。)
如果惌对list或者iterate查询的结果缓存,p用到查询~存?br />
查询~存
首先需要配|hibernate.cache.use_query_cache=true
如果用ehcacheQ配|ehcache.xmlQ注意hibernate3.0以后不是net.sf的包名了

maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"
timeToLiveSeconds="7200" overflowToDisk="true"/>

maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/>
然后
query.setCacheable(true);//ȀzL询缓?br />query.setCacheRegion("myCacheRegion");//指定要用的cacheRegionQ可?br />W二行指定要使用的cacheRegion是myCacheRegionQ即你可以给每个查询~存做一个单独的配置Q用setCacheRegion来做q个指定Q需要在ehcache.xml里面配置它:

如果省略W二行,不设|cacheRegion的话Q那么会使用上面提到的标准查询缓存的配置Q也是net.sf.hibernate.cache.StandardQueryCache

对于查询~存来说Q缓存的key是根据hql生成的sqlQ再加上参数Q分늭信息Q可以通过日志输出看到Q不q它的输Z是很可读Q最好改一下它的代码)?br />比如hqlQ?br />from Cat c where c.name like ?
生成大致如下的sqlQ?br />select * from cat c where c.name like ?
参数?tiger%"Q那么查询缓存的key*大约*是这L字符Ԍ我是凭记忆写的,q不_Q不q看了也该明白了Q:
select * from cat c where c.name like ? , parameter:tiger%
q样Q保证了同样的查询、同L参数{条件下h一Lkey?br />? 在说说缓存的valueQ如果是list方式的话Qvalue在这里ƈ不是整个l果集,而是查询出来的这一串ID。也是_不管是listҎq是 iterateҎQ第一ơ查询的时候,它们的查询方式很它们qx的方式是一LQlist执行一条sqlQiterate执行1+N条,多出来的行ؓ? 它们填充了缓存。但是到同样条gW二ơ查询的时候,都和iterate的行Z样了Q根据缓存的keyȝ存里面查CvalueQvalue是一? idQ然后在到class的缓存里面去一个一个的load出来。这样做是ؓ了节U内存?br />可以看出来,查询~存需要打开相关cȝclass~存。list和iterateҎW一ơ执行的时候,都是既填充查询缓存又填充class~存的?br />q里q有一个很Ҏ被忽视的重要问题Q即打开查询~存以后Q即使是listҎ也可能遇?+N的问题!? 同条件第一ơlist的时候,因ؓ查询~存中找不到Q不class~存是否存在数据QL发送一条sql语句到数据库获取全部数据Q然后填充查询缓存和 class~存。但是第二次执行的时候,问题来了,如果你的class~存的超时时间比较短Q现在class~存都超时了Q但是查询缓存还在,那么 listҎ在获取id串以后,会一个一个去数据库loadQ因此,class~存的超时时间一定不能短于查询缓存设|的时旉Q如果还讄了发呆时 间的话,保证class~存的发呆时间也大于查询的缓存的生存旉。这里还有其他情况,比如class~存被程序强制evict了,q种情况p自己注意 了?br />
另外Q如果hql查询包含select字句Q那么查询缓存里面的value是整个l果集了?br />
当hibernate更新数据库的时候,它怎么知道更新哪些查询~存呢?
hibernate在一个地方维护每个表的最后更新时_其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配|里面?br />? 通过hibernate更新的时候,hibernate会知道这ơ更新媄响了哪些表。然后它更新q些表的最后更新时间。每个缓存都有一个生成时间和q个~? 存所查询的表Q当hibernate查询一个缓存是否存在的时候,如果~存存在Q它q要取出~存的生成时间和q个~存所查询的表Q然后去查找q些表的最? 更新旉Q如果有一个表在生成时间后更新q了Q那么这个缓存是无效的?br />可以看出Q只要更新过一个表Q那么凡是涉及到q个表的查询~存失效了Q因此查询缓存的命中率可能会比较低?br />
Collection~存
需要在hbm的collection里面讄

假如class是CatQcollection叫childrenQ那么ehcache里面配置

maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"
overflowToDisk="true" />
Collection的缓存和前面查询~存的list一P也是只保持一串idQ但它不会因个表更新q就失效Q一个collection~存仅在q个collection里面的元素有增删时才失效?br />q样有一个问题,如果你的collection是根据某个字D|序的Q当其中一个元素更C该字D|Q导致顺序改变时Qcollection~存里面的顺序没有做更新?br />
~存{略
只读~存Qread-onlyQ:没有什么好说的
?写缓存(read-writeQ?E序可能要的更新数据
不严格的?写缓存(nonstrict-read-writeQ:需要更新数据,但是两个事务更新同一条记录的可能性很,性能比读写缓存好
事务~存QtransactionalQ:~存支持事务Q发生异常的时候,~存也能够回滚,只支持jta环境Q这个我没有怎么研究q?br />
d~存和不严格d~存在实C的区别在于,d~存更新~存的时候会把缓存里面的数据换成一个锁Q其他事务如果去取相应的~存数据Q发现被锁住了,然后q接取数据库查询?br />在hibernate2.1的ehcache实现中,如果锁住部分~存的事务发生了异常Q那么缓存会一直被锁住Q直?0U后时?br />不严D写缓存不锁定~存中的数据?br />

使用二~存的前|条?/span>
? 的hibernateE序Ҏ据库有独占的写访问权Q其他的q程更新了数据库Qhibernate是不可能知道的。你操作数据库必需直接通过 hibernateQ如果你调用存储q程Q或者自׃用jdbc更新数据库,hibernate也是不知道的。hibernate3.0的大扚w更新和删 除是不更CU缓存的Q但是据?.1已经解决了这个问题?br />q个限制相当的棘手,有时候hibernate做批量更新、删除很慢,但是你却不能自己写jdbc来优化,很郁闷吧?br />SessionFactory也提供了U除~存的方法,你一定要自己写一些JDBC的话Q可以调用这些方法移除缓存,q些Ҏ是:
void evict(Class persistentClass)
Evict all entries from the second-level cache.
void evict(Class persistentClass, Serializable id)
Evict an entry from the second-level cache.
void evictCollection(String roleName)
Evict all entries from the second-level cache.
void evictCollection(String roleName, Serializable id)
Evict an entry from the second-level cache.
void evictQueries()
Evict any query result sets cached in the default query cache region.
void evictQueries(String cacheRegion)
Evict any query result sets cached in the named query cache region.
? q我不徏议这样做Q因样很隄护。比如你现在用JDBC扚w更新了某个表Q有3个查询缓存会用到q个表,用evictQueries(String cacheRegion)U除?个查询缓存,然后用evict(Class persistentClass)U除了class~存Q看上去好像完整了。不q哪天你d了一个相x询缓存,可能会忘记更新这里的U除代码。如果你? jdbc代码到处都是Q在你添加一个查询缓存的时候,q知道其他什么地方也要做相应的改动吗Q?br />
----------------------------------------------------

ȝQ?/span>
不要惛_然的以ؓ~存一定能提高性能Q仅仅在你能够驾驭它q且条g合适的情况下才是这L。hibernate的二U缓存限制还是比较多的,不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下ؕ用,可能会有1+N的问题。不当的使用q可能导致读数据?br />如果受不了hibernate的诸多限Ӟ那么q是自己在应用程序的层面上做~存吧?br />? 高的层面上做缓存,效果׃好。就好像管盘有缓存,数据库还是要实现自己的缓存,管数据库有~存Q咱们的应用E序q是要做~存。因为底层的~存 它ƈ不知道高层要用这些数据干什么,只能做的比较通用Q而高层可以有针对性的实现~存Q所以在更高的别上做缓存,效果也要好些吧?br />

l于写完了,好篏…?/cache>


艑ְ 2006-08-14 15:11 发表评论
]]>
收藏一extremeComponents使用AJAX 指南http://www.aygfsteel.com/aichan/articles/38314.html艑ְ艑ְThu, 30 Mar 2006 10:43:00 GMThttp://www.aygfsteel.com/aichan/articles/38314.htmlhttp://www.aygfsteel.com/aichan/comments/38314.htmlhttp://www.aygfsteel.com/aichan/articles/38314.html#Feedback0http://www.aygfsteel.com/aichan/comments/commentRss/38314.htmlhttp://www.aygfsteel.com/aichan/services/trackbacks/38314.html
extremeComponents使用AJAX 指南
Mon, 27 Mar 2006 08:09:00 GMT

AJAX 指南

q行?..


在eXtremeTable中用AJAX非常单,对现有功能的扩展也非常方ѝ?AJAX整合一个最强大的地Ҏ它不需要整合。你可以自由C用Q何你惌使用的AJAX工具包。所有你要做的就是:当表的action被调用时Q告?eXtremeTable使用什么javascript。表的actions包括Q过滤、排序、分c显C的行数和导出?

在我自己的示例中我将使用非常LDWR工具包。DWR 需要的_合代码非常,q样我们只需要关注如何构。你可以通过本站CZ看到效果!

Assembler Example

本示例中需要安装DWR工具包,创徏POJO来构造表q创建包含eXtremeTable的JSP面?

安装DWR

首先要做的就?a rel="nofollow" title="http://getahead.ltd.uk/dwr/download" class="external text" >下蝲DWR工具包。你应该览|站的用说明,不过下面是我让它W合我的需要来工作所q行的操?

  • dwr-1.1.jar拯到WEB-INF/lib目录
  • 在WEB-INF目录下创Z个dwr.xml文g
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">

<dwr>
<allow>
<create creator="new" javascript="Assembler">
<param name="class" value="org.extremesite.controller.Assembler"/>
<include method="getTable"/>
</create>
</allow>
<signatures>
<![CDATA[
import java.util.Map;
import java.util.List;
import org.extremesite.controller.Assembler;
import javax.servlet.http.HttpServletRequest;
Assembler.getTable(Map<String, List> parameterMap, HttpServletRequest request);
]]>
</signatures>
</dwr>

而言之(In a nutshellQ创建(createQ标{օ许当Ҏ被调用时Q参照构需要的POJO。签名(signatureQ标{֣明了被调用方法用的实际 cd?本示例的AssemblercȝgetTableҎ通过传入一个MapQ包含form参数Q和HttpServletRequest?

  • 在WEB-INF/web.xml中对DWR servletq行声明
  <servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

以上完成了DWR servlet的设|,它被用来调用你的POJO。除了设|它Q你不需要对q个servlet有更多的了解?

创徏POJO

DWR使用Qworks withQPOJOs。这个非常符合我们的需要,因ؓeXtremeTable有够的API使用Jsp标签来构造表。实际上QJSP标签只不q是eXtremeTable Java API的前端。首先,我将展示构造表的方法:

public class Assembler {
private Object build(TableModel model, Collection presidents) throws Exception {
Table table = model.getTableInstance();
table.setTableId("assembler");
table.setItems(presidents);
table.setAction(model.getContext().getContextPath() + "/assembler.run");
table.setTitle("Presidents");
table.setOnInvokeAction("buildTable('assembler')");
model.addTable(table);

Export export = model.getExportInstance();
export.setView(TableConstants.VIEW_XLS);
export.setViewResolver(TableConstants.VIEW_XLS);
export.setImageName(TableConstants.VIEW_XLS);
export.setText(TableConstants.VIEW_XLS);
export.setFileName("output.xls");
model.addExport(export);

Row row = model.getRowInstance();
row.setHighlightRow(Boolean.FALSE);
model.addRow(row);

Column columnName = model.getColumnInstance();
columnName.setProperty("fullName");
columnName.setIntercept((AssemblerIntercept.class).getName());
model.addColumn(columnName);

Column columnNickName = model.getColumnInstance();
columnNickName.setProperty("nickName");
model.addColumn(columnNickName);

Column columnTerm = model.getColumnInstance();
columnTerm.setProperty("term");
model.addColumn(columnTerm);

Column columnBorn = model.getColumnInstance();
columnBorn.setProperty("born");
columnBorn.setCell(TableConstants.DATE);
model.addColumn(columnBorn);

Column columnDied = model.getColumnInstance();
columnDied.setProperty("died");
columnDied.setCell(TableConstants.DATE);
model.addColumn(columnDied);

Column columnCareer = model.getColumnInstance();
columnCareer.setProperty("career");
model.addColumn(columnCareer);

return model.assemble();
}
}

上面的大部分代码是自解释性的Q你在下面看到如何构造一个TableModelQ但是首先你应该注意到TableModel是构造表旉要交互的 唯一对象。构造表的第一步就是用TableModel来创建Table、Row、Column和Export?一旦你创徏了一个model对象Q你只需要将它添加到model中。除非你它d到TableModelQ否则的话model不会是用它。所有东西已 l构建好后,你只需要调用model.assemble()Ҏ来构造表了?

可能table.setOnInvokeAction("buildTable('assembler')");是最有趣的调用。当你用表的actions(页、过滤、排?.....)Q这个javascriptҎ被调用。如果表的onInvokeActionI白Q则默认的javascriptҎ被提交QsubmitQ?Q正如你所期望的那栗?

Assemblercȝ另一个方?--getTable()Q?

public class Assembler {
public String getTable(Map parameterMap, HttpServletRequest request) {
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());

PresidentsDao presidentsDao = (PresidentsDao) webApplicationContext.getBean("presidentsDao");
Collection presidents = presidentsDao.getPresidents();

Context context = null;
if (parameterMap == null) {
context = new HttpServletRequestContext(request);
} else {
context = new HttpServletRequestContext(request, parameterMap);
}

TableModel model = new TableModelImpl(context);
try {
return build(model, presidents).toString();
} catch (Exception e) {
e.printStackTrace();
}

return "";
}
}

q个Ҏ调用比较频繁Q它执行双重职责。它需要被ControllerQ如果用Spring的话Q在W一ơ调用,如果使用Strutsq同于ActioncR?/em> 随后Q?当用AJAXӞq个Ҏ也需要被调用Q但是这ơ将传入一个定制的parameterMap。parameterMap包含eXtremeTable使用AJAX需要的所有参数。当你看?Controller和JSP后,q点更加清晰?

Controller

public class AssemblerController extends AbstractController {
public String successView;

public void setSuccessView(String successView) {
this.successView = successView;
}

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView(successView);
Assembler assembler = new Assembler();
Object viewData = assembler.getTable(null, request);
request.setAttribute("assembler", viewData);
return mv;
}
}

controller在被W一ơ调用时来构。它调用POJOq将表传lrequest。注意空|nullQ如何用parameterMap传输。这是因为第一ơ表被构造时Q没有对应表需要知道的actions?

JSP

通过引入(importing)合适的javascript文g来开始构建JSP面。唯一需要包含进工程的javascript文g是extremecomponents.jsQ其它的javascript文gx都是DWR使用的?

  <script type="text/javascript" src="<c:url value="/dwr/interface/Assembler.js"/>"></script>
<script type="text/javascript" src="<c:url value="/dwr/engine.js"/>"></script>
<script type="text/javascript" src="<c:url value="/dwr/util.js"/>"></script>
<script type="text/javascript" src="<c:url value="/js/extremecomponents.js"/>"></script>

接着Q插入钩子(hook)来显CQdiv被用来调用innerHtmlq构建新的标{?

  <div id="tableDiv">
<c:out value="$" escapeXml="false"/>
</div>

最后,djavascript来调用DWR的钩子(hooksQ?

<script type="text/javascript">
function buildTable(form) {
var parameterMap = getParameterMap(form);
Assembler.getTable(parameterMap, showTable);
}

function showTable(table) {
document.getElementById('tableDiv').innerHTML=table;
}
</script>

getParameterMap()Ҏ包含在extremecomponents.js文g中,的到所有的form参数。你需要传入一?form id的参照。记住,eXtremeTable本质上是一个forml徏Qtableid作ؓform id使用。默认的tableId为ecQ但是你通常惌讄tableIdQ以C大家能更容易阅M的代码。你用parameterMap调用 POJO的getTableҎ。showTable是一个callback告诉DWR当从getTable()Ҏq回时将调用什么操作?

l论

本指南描qC在eXtremeTable中用AJAX所需要的步骤。需要留心的一个主要事情是没有和AJAX发生实际整合。当表的actions 被用是Q你只需要简单地告诉eXtremeTable什么javascript被调yong。另一个事情是Q通过本示例我们可以知道DWR工具包?POJOsq能够简单地被Q何框架用?





艑ְ 2006-03-30 18:43 发表评论
]]>
Javascript callback and function pointerhttp://www.aygfsteel.com/aichan/articles/37200.html艑ְ艑ְFri, 24 Mar 2006 05:41:00 GMThttp://www.aygfsteel.com/aichan/articles/37200.htmlhttp://www.aygfsteel.com/aichan/comments/37200.htmlhttp://www.aygfsteel.com/aichan/articles/37200.html#Feedback0http://www.aygfsteel.com/aichan/comments/commentRss/37200.htmlhttp://www.aygfsteel.com/aichan/services/trackbacks/37200.html单的代码CZQ?br /><!--
function show(cbfunction,name){
        return function(sex){//q里q回一个有参数的Function
            cbfunction(name);//调用参数传入的函?/span>
            alert(sex);
        }
    }
function hello(name){
       alert("hello " + name);
}
var fn = show(hello,"aichen");//q回的是一个函?fn 为函数指?/span>
fn("boy");
--//>
have fun!^_^


艑ְ 2006-03-24 13:41 发表评论
]]>
վ֩ģ壺 | ԣ| | | | | ɰ| | Ѯ| ͼ| ˻| | | ɽ| ɽ| ƽ| ɽ| Դ| տ| ԣ| | ȫ| | | ¡| | | | | Ƹ| ƽ| ĵ| ָɽ| ֵ| | | ԭ| Ī| ӱ| ͼƬ| |