ibatis.net的缓存问题

zhuxinbin 2007-10-17 07:10:28
最近的项目中使用了ibatis.net,感觉挺好用的,开发效率也大幅度提高。
但是,在设置缓存的时候,出现了问题,麻烦各位大虾给俺看看。

我使用的是SqlMapper1.6.1,查看source发现RequestScope类每实例化一个对象后,其内部的ID就要加1,
导致每次Cachekey都不一样,最后就导致cache没有发挥相应的作用,反而浪费了内存。
下面是我的修改方法:
//cacheKey.Update(request);

CachingStatement
private CacheKey GetCacheKey(RequestScope request)
{
CacheKey cacheKey = new CacheKey();
int count = request.IDbCommand.Parameters.Count;
for (int i = 0; i < count; i++)
{
IDataParameter dataParameter = (IDataParameter)request.IDbCommand.Parameters[i];
if (dataParameter.Value != null)
{
cacheKey.Update( dataParameter.Value );
}
}

cacheKey.Update(_mappedStatement.Id);
cacheKey.Update(_mappedStatement.SqlMap.DataSource.ConnectionString);
cacheKey.Update(request.IDbCommand.CommandText);

CacheModel cacheModel = _mappedStatement.Statement.CacheModel;
if (!cacheModel.IsReadOnly && !cacheModel.IsSerializable)
{
//cacheKey.Update(request);
}
return cacheKey;
}

不知道各位有没有好的办法?
...全文
271 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuhyhappy 2008-07-30
  • 打赏
  • 举报
回复
学习。。。。。。。。。。
zhuxinbin 2007-10-18
  • 打赏
  • 举报
回复
是否没有设置导致没起作用呢

<settings >
……
<setting cacheModelsEnabled="true"/ >
……
</settings >

这个我设置了,要不然我把那行注释掉后,也不能缓存;但是实际上是可以的。
下面是我的SqlMap.config的设置:

<properties resource="config/properties.config"/>
<settings>
<setting useStatementNamespaces="true"/>
<setting cacheModelsEnabled="true"/>
<setting useReflectionOptimizer="true"/>
</settings>

<!--指定数据源
${datasource} ${database} ${userid} ${password} 为DataBase.config定义的值
-->
<database>
<provider name="sqlServer2.0"/>
<dataSource name="mydb" connectionString="server=${datasource};database=${database};user id=${username};password=${password}"/>
</database>

<!--指定映射的文件的位置 -->
<sqlMaps>
<sqlMap embedded="Workflow.Da.Config.Base.UncompleteOrdersUsedPaperResultMap.config, Workflow.Support" />
<sqlMap embedded="Workflow.Da.Config.Base.BaseBusinessTypePriceSetResultMap.config, Workflow.Support" />


。。。。。。。。。
。。

</sqlMaps>
</sqlMapConfig>
zhuxinbin 2007-10-18
  • 打赏
  • 举报
回复
目前我如果不修改的情况下,如果设置了缓存,不仅不起作用,反而浪费内存,而且会越来越多。
那么多人用,难道没有问题嘛?
zhuxinbin 2007-10-18
  • 打赏
  • 举报
回复
没有人使用Ibatis吗?
麻烦潜水的同志也出来帮咱看看嘛。

小弟在此谢了
viena 2007-10-17
  • 打赏
  • 举报
回复
SqlMap.config
viena 2007-10-17
  • 打赏
  • 举报
回复
是否没有设置导致没起作用呢

<settings>
……
<setting cacheModelsEnabled="true"/>
……
</settings>
zhuxinbin 2007-10-17
  • 打赏
  • 举报
回复
自己顶一下
TERRYYRRET 2007-10-17
  • 打赏
  • 举报
回复
学习
zhuxinbin 2007-10-17
  • 打赏
  • 举报
回复
我也是这么认为的,但是出来的效果就是这样,我的cache配置如下
<cacheModels>
<cacheModel id="MasterTradeCache" implementation="FIFO" readOnly="false">
<flushInterval hours="24"/>
<flushOnExecute statement="MasterTradeBase.Insert"/>
<flushOnExecute statement="MasterTradeBase.Update"/>
<flushOnExecute statement="MasterTradeBase.LogicDelete"/>
<flushOnExecute statement="MasterTradeBase.Delete"/>
<property name="CacheSize" value="100" />
</cacheModel>
</cacheModels>

引用如下:
<select id="SelectAll" resultMap="MasterTradeResultMap.selectResult"
cacheModel="MasterTrade.MasterTradeCache">
SELECT
ID, NO, NAME, INSERT_DATE_TIME, INSERT_USER, UPDATE_DATE_TIME, UPDATE_USER, VERSION, DELETED, COMPANY_ID, BRANCH_SHOP_ID
FROM MASTER_TRADE
Where DELETED = '0'
AND COMPANY_ID = #CompanyId#
AND BRANCH_SHOP_ID = #BranchShopId#
ORDER BY NO
</select>
<select id="SelectByPk" parameterClass="long" resultMap="MasterTradeResultMap.selectResult"
cacheModel="MasterTrade.MasterTradeCache">
SELECT
ID, NO, NAME, INSERT_DATE_TIME, INSERT_USER, UPDATE_DATE_TIME, UPDATE_USER, VERSION, DELETED, COMPANY_ID, BRANCH_SHOP_ID
FROM MASTER_TRADE
WHERE ID = #Id# AND DELETED = '0'

</select>
viena 2007-10-17
  • 打赏
  • 举报
回复
没研究过他的源码,不过个人认为他不会犯这种低级错误吧~

17,748

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧