读书人

讨论:Codematic代码生成器的性能有关

发布时间: 2012-01-19 20:57:58 作者: rapoo

讨论:Codematic代码生成器的性能问题(散分)
最近我公司开发一套中型网站系统,数据访问层和业务逻辑层采用了李天平先生的Codematic1.1代码生成系统。但是在项目实际运行过程中我发现只要同时在线的人数达到100多的时候就会产生死锁,当然我还无法确定死锁产生的原因是由于这个数据访问层导致的,目前只是对这种写法有所怀疑,由于我个人对.net的知识掌握不深,但仔细研究了codematic的三层代码之后我觉得他的数据访问层和业务逻辑层好象有些不妥,虽然在测试的环境下看不出来,所以想到李天平先生的论坛(bbs.maticsoft.com)去讨论,无奈该论坛已经停止注册了,希望能在这里进行讨论,在讨论的过程中能学习到更多的知识。如果李天平先生看到这篇讨论,请原谅我的行为,我个人纯粹是站在技术的角度来提出这次讨论,并没有对李先生不敬的意思。

相关资料:李天平先生的数据访问层DbHelperSQL.cs http://download.csdn.net/user/salifei/ 刚上传完毕,要过段时间才能下载
Maticsoft网站 http://www.maticsoft.com 该站点有1.1和2.0两种版本的代码生成机下载,2.0版本尚未完成

讨论对象:我们的讨论以1.1版的DbHelperSQL(以下简称为DBHS)为对象。
讨论问题:1.DBHS的连接池泄露问题。
2.DBHS的连接并发问题。

我的个人分析:
1.关于连接池泄露:
在DBHS中大多数的方法所用到的Connection都有using关键字限定作用域,也就是说这些方法中不会产生连接池中的连接泄露,但是所有返回值为SqlDataReader的方法都没有使用using关键字,这么做是正确的,因为SqlDataReader只有在连接到数据库的状态下才能读取数据,这一点是与DataSet不同,在DBHS中的一个例子:
/// <summary>
/// 执行查询语句,返回SqlDataReader
/// </summary>
/// <param name= "strSQL "> 查询语句 </param>
/// <returns> SqlDataReader </returns>
public static SqlDataReader ExecuteReader(string strSQL)
{
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(strSQL,connection);
try
{
connection.Open();
SqlDataReader myReader = cmd.ExecuteReader(); //注意这一行
return myReader;
}
catch(System.Data.SqlClient.SqlException e)
{
throw new Exception(e.Message);
}

}

在这个例子中该ExecuteReader没有使用参数CommandBehavior.CloseConnection,这里会导致连接池泄露的问题,假定在业务逻辑层使用该方法获取了某个SqlDataReader,该SqlDataReader使用完毕Close()之后,应该是不会关闭所使用的Connection,并且也没有其他方式能够关闭这个Connection,于是该连接被泄露,由于数据库连接资源是非托管资源,垃圾回收器也无法关闭这样的连接。
还是这个例子,在错误处理部分也没有关闭Connection,也就是说如果传入的SQL语句导致该方法出错,这个连接一样会泄露掉。
同样的问题在这个类中有3处存在,分别是ExecuteReader(string strSQL)、SqlDataReader ExecuteReader(string SQLString,params SqlParameter[] cmdParms)、RunProcedure(string storedProcName, IDataParameter[] parameters )

[解决办法]
我也看过CODEMATIC,也用过,
最让人烦的是,居然没设基层接口,后来就没用了

[解决办法]
新人最好别用这些代码生成工具,这样会影响你能力的提升的。
[解决办法]
我现在用自己写的codesmith模版
[解决办法]
应该不是Codematic的问题,他那个SqlDataReader的函数没有问题,微软的企业库差不多也是这样设计的,不过你自己要注意及时关闭datareader,如果不放心的话,可以返回dataset.猜十有八九是你自己SQL语句有问题,仔细检查
[解决办法]
学习ing,刚入门.

[解决办法]
up
[解决办法]
顶一下
不知道李大侠会不会看到
[解决办法]
做人要厚道!
[解决办法]
我认为释放connection应从另一个方面考虑,如果在每次执行完DataReader,或其它数据库相关操作后都要释放connection,那么当我们再执行其它操作时,我们是否要重新的接连connection??那数据库连接这部分也是要消耗资源的.
[解决办法]
有数据库链接池的,不用太担心
[解决办法]
应该不是Codematic的问题,他那个SqlDataReader的函数没有问题,微软的企业库差不多也是这样设计的,不过你自己要注意及时关闭datareader,如果不放心的话,可以返回dataset.猜十有八九是你自己SQL语句有问题,仔细检查
====================================================================================
上面的这位说到DataReader我想到一个开发中经常碰到的问题,就是你千万要注意用玩DataReader要把它关闭掉,不然的话超出连接池,就会出现楼主说的情况。
[解决办法]
这个贴子很深刻.

期待高人加入讨论.
[解决办法]
我觉得没必要使用codematc
这个生成器我也用过。我觉得用petshop方式写代码太内了。 好麻烦
为什么不使用GotDotNet的DAAB呢

不就是个跨数据库嘛。微软企业库我觉得还是很值得使用的。..根本不用去想con.close的问题。
而且开源.可以学习学习



[解决办法]
在DBHS中大多数的方法所用到的Connection都有using关键字限定作用域,也就是说这些方法中不会产生连接池中的连接泄露,但是所有返回值为SqlDataReader的方法都没有使用using关键字,这么做是正确的,因为SqlDataReader只有在连接到数据库的状态下才能读取数据,这一点是与DataSet不同,在DBHS中的一个例子:
----------------------------------------------

IList,和IList <> 可以解决DataReader不能离线操作的做好办法啊.我目前认为

[解决办法]

新人最好别用这些代码生成工具,这样会影响你能力的提升的。
[解决办法]
借楼主的宝地,发个一直没有解决的帖子,codesmith的。
http://community.csdn.net/Expert/topic/5746/5746390.xml?temp=.9344141
[解决办法]
学习
[解决办法]
呵呵。用过这个工具,觉得还不错。。
不过一般只是用那些简单的用法。比如简单的存储过程。 实体类。属性的编写

其他的都是手写了。
[解决办法]
没用过,帮顶,接分
[解决办法]
讨论人少的原因是你的帖子太长了,没人有耐心看完。
[解决办法]
很少用李天平的东西。。。。。
[解决办法]
我用了codmatic,但我只用了实体层和数据访问层,接口层我没用,
[解决办法]
weir55 说:新人最好别用这些代码生成工具,这样会影响你能力的提升的。
我不知道为什么会影响能力的提升,能否解释一下
[解决办法]
我有个同事也用的这个生成代码,其实就是DbHelper类里的数据库连接问题。
好像是用了一个静态连接吧,忘记了,改成每次使用新连接,用完关闭就好了。
公司网站一天几百万IP,也没有问题。
[解决办法]
不是全局的连接就行。注意关闭。
[解决办法]
哈。我没用过新版。

读书人网 >asp.net

热点推荐