问一下:有多少朋友在生产系统中使用了CLR了呢? 100superhasty]

发布时间:2016-12-8 14:14:05 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"问一下:有多少朋友在生产系统中使用了CLR了呢? 100superhasty]",主要涉及到问一下:有多少朋友在生产系统中使用了CLR了呢? 100superhasty]方面的内容,对于问一下:有多少朋友在生产系统中使用了CLR了呢? 100superhasty]感兴趣的同学可以参考一下。

我老是担心使用CLR会造成内存方面的问题,比如内存不能回收。其实想一想也许我过滤了,毕竟.NET Framework能够自己回收托管内存。既然在应用服务器上能使用,数据库上似乎也可以使用。 呵呵,希望听一听大家的经验和见解~~

没用过,帮顶

其实怎么说呢?内存回收机制确实很智能,只不过只需要把比如打开文件啊,开数据库啊什么的关闭就可以了。就不会造成多余的系统开销。如果害怕的话,可以写段折构函数!以前学习的时候写过一个例子,但是用处不打,可以借鉴一下。 using System; using System.IO; using System.Windows.Forms; namespace nameSpace1 { public class gcDemo:IDisposable { static int ctor_cnt = 0; static int dtor_cnt = 0; static public gcDemo c1; static public StreamWriter ofile; static int iterations; private bool isDispose = false; public void Dispose() { Dispose(true); System.GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if(!isDispose) { if(disposing) ofile.Close(); } isDispose = true; } static public int Iterations { get { return iterations; } set { iterations = value; } } static gcDemo() { string startupPath; startupPath = Application.StartupPath; ofile = new StreamWriter(new FileStream(startupPath+@"\fx.txt",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None)); ofile.WriteLine("all trace output at {0}", startupPath+@"\fx.txt"); Console.WriteLine("startupPath is :{0}", startupPath); } public gcDemo() { ofile.WriteLine("gcDemo Class Constructor: {0}", ++ctor_cnt); ofile.Flush(); } ~gcDemo() { try { ofile.WriteLine("gcDemo Class Destructor: {0}", ++dtor_cnt); } catch(Exception ex) { Console.WriteLine(ex.Message); } Dispose(false); } static public void gcObject() { for(int ix = 0;ix<gcDemo.Iterations;ix++) c1 = new gcDemo(); } } class EntryPoint { public static void testM() { gcDemo.Iterations = 100; gcDemo.gcObject(); } static void Main() { testM(); gcDemo.c1.Dispose(); try { gcDemo.ofile.WriteLine("test"); } catch(Exception ex) { Console.WriteLine(ex.Message); } System.Threading.Thread.Sleep(3000); } } } 在上面的例子中看出,折构函数~gcDemo的特性为,系统能够确保非托管代码在程序执行后能够得到回收。因为原理是~gcDemo的代码被封装在Finalize()方法的一个try块内。并且把该方法调用放在finally中,由此确保了它的执行,但是缺点是,是在程序执行完毕后进行删除对象需要处理两次才行,第一次不处理,第二次删除,由此可能对系统效率产生很大的影响。 比如我在~gcDemo程序中加入的 try { ofile.WriteLine("gcDemo Class Destructor: {0}", ++dtor_cnt); } catch(Exception ex) { Console.WriteLine(ex.Message); } 每次都要等把gcDemo Class Destructor:写了以后才会收回资源,由此产生了很大的效率浪费。所以系统提供了另一种方法,就是IDisposable接口,使用Dispose()来把非托管代码进行清空。 比如 gcDemo.c1.Dispose(); 在执行完毕以后,就对ofile这个StreamWriter对象进行了关闭,那么折构函数中的ofile.WriteLine方法就全部失效了!但是有个问题就是,需要程序人员手动进行设置,由此可能出现没有设置到,或者因为程序出错而出现的非托管垃圾驻留。因此微软提供了上面的双重方法来提供保险,对于程序员来说可以利用,但是也要根据情况来定了。 还有,就是如果要安全起见的话,那么也可以采用IDisposable接口,然后用using来调用有非托管代码的语句。如 using System; using System.IO; using System.Windows.Forms; namespace nameSpace1 { class myTest:IDisposable { static public StreamWriter ofile; private string stPath; public myTest() { stPath = Application.StartupPath; ofile = new StreamWriter(new FileStream(stPath+@"\fx2.txt", FileMode.OpenOrCreate)); ofile.WriteLine("This is a test file!"); } #region IDisposable 成员 public void Dispose() { // TODO:  添加 myTest.Dispose 实现 ofile.Close(); } #endregion } class EntryPoint { static void Main() { using(myTest my = new myTest()) { myTest.ofile.WriteLine("这是我的第二次的写入!"); } try { myTest.ofile.WriteLine("这是我的第三次写入!"); } catch(Exception ex) { Console.WriteLine(ex.Message); } } } } 在该程序中,This is a test file!和这是我的第二次的写入都可以被写入到文件,但是由于using语句包裹的语句具有限制范围,必须在{}和里面有效果,因此出了using以后就自动调用了Dispose()了。由此,这是我的第三次写入就发生了错误。但是要注意的是,对象一定要有Dispose()方法,要不不会被资源管理器给收回了的,比如,我把//ofile.Close()屏蔽了后,添加ofile.Flush()方法,那么就会把三条语句一并写入。

顶楼上的强人!

从没用过析构函数,感觉.net自己的回收机制确实不错 CLR感觉局限性太强,个人认为生产环境不建议使用,这个仅学习,了解一下就好

CLR感觉局限性太强,个人认为生产环境不建议使用 ---------------------------------------- 您所说的局限性在哪里呢?

与楼上同问

一般不用, 主要是DBA管理这种东西的时候会很麻烦, 因为自己写的CLR很难保证没有BUG, 一旦出BUG, 如果只是影响调用那一部分还好, 如果导致整个服务挂掉, 则很危险了(而且往往导致服务器挂掉还不一定查得出来是否CLR的问题) 另外, 部署和迁移也是要考虑的问题之一

基本没有,写不好

另外, 感觉 CLR 还没有想像中的那么稳定(或者是与 SQL SERVER 的配合没有想像中的好) 例如在处理 复制出错的时候, 有时会调用一些存储过程去查看出错相关的信息, 这些存储过程中的一部分就是 CLR 存储过程, 经常会发现怎么也调不成功, 说什么内存错误什么的, 但实际上空闲内存肯定是够的. 而且一般第一次调用CLR的时候, 加载程序集花费的时间也不短, 所以如果 CLR 用得多, 内存又不太够, 导致一些CLR程序集老是反复加载的话, 性能会非常低

Agree。 不在自己控制范围下的东西,很难处理。

   CLR 做为一种新的技术,肯定有它的用武之地,    MSDN上也说的很清楚,东西是好的,要看如何去用,    主要是看使用的地方对不对和如何使用,,,,,,,

还没用2005,谈不上用clr..

2005中引入CLR也是为了加强TSQL的功能 一般情况下不用 但如果涉及复杂的程序/后台交互调用 或者利用现成的逻辑的时候 也需要的 

结合应用,处理了一些加密解密过程,效果很好。

生产系统中使用还是比较玄的。 生产管理方面还是可以的。

用了一下...不错哦.... ----------------------------------------------------------------------------------------------------- -- 测试指定的目标字符串是否与给定的正则表达式模式匹 /* IF ForString.IsMatchPattern(NULL, NULL)   = 1 PRINT 'yes' ELSE PRINT 'no' DECLARE @target nvarchar(128) SET @target = N'a阿阿abcdef ppps' IF ForString.IsMatchPattern(@target, '[\u00ff-\uffff]+[a-z]+\s*[p]+')  = 1 PRINT 'yes' ELSE PRINT 'no' IF ForString.IsMatchPattern(@target, '[\u00ff-\uffff]+[a-z]+\s*[p]+$')  = 1 PRINT 'yes' ELSE PRINT 'no' */ IF OBJECT_ID(N'ForString.IsMatchPattern') IS NOT NULL DROP FUNCTION ForString.IsMatchPattern GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集 CREATE FUNCTION ForString.IsMatchPattern -- 测试指定的目标字符串是否与给定的正则表达式模式匹配 ( @target nvarchar(512) , -- 要测试的目标字符串 @pattern nvarchar(512) , -- 给定的正则表达式模式 @nullreturn bit = 0 -- 当 target 为 null 时的返回值 ) RETURNS bit -- 如果 target 或 pattern 为 null 则返回 false,否则返回测试的结果 AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForString].IsMatchPattern GO ----------------------------------------------------------------------------------------------------- -- 对左操作数和右操作数进行二进制按位“或”运算 /* PRINT ISNULL(ForBinary.OperationOr(NULL, NULL), 0x0) PRINT ISNULL(ForBinary.OperationOr(0x123, NULL), 0x0) PRINT ISNULL(ForBinary.OperationOr(0x60, 0x06), 0x0) */ IF OBJECT_ID(N'ForBinary.OperationOr') IS NOT NULL DROP FUNCTION ForBinary.OperationOr GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集 CREATE FUNCTION ForBinary.OperationOr -- 对左操作数和右操作数进行二进制按位“或”运算 ( @left varbinary(max) , -- 左操作数 @right varbinary(max) -- 右操作数 ) RETURNS varbinary(max) AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForBinary].OperationOr GO ----------------------------------------------------------------------------------------------------- -- 对左权限和右权限进行权限“或”运算 /* PRINT ISNULL(ForBinary.PermissionOr(NULL, NULL), 0x0) PRINT ISNULL(ForBinary.PermissionOr(0x123, NULL), 0x0) PRINT ISNULL(ForBinary.PermissionOr(0x60, 0x06), 0x0) */ IF OBJECT_ID(N'ForBinary.PermissionOr') IS NOT NULL DROP FUNCTION ForBinary.PermissionOr GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集 CREATE FUNCTION ForBinary.PermissionOr -- 对左权限和右权限进行权限“或”运算 ( @left permission , -- 左权限 @right permission -- 右权限 ) RETURNS permission AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForBinary].OperationOr GO ----------------------------------------------------------------------------------------------------- -- 将所有分配给某公司职员的身份角色格式化成一个字符串。 /* PRINT IdentityRole.FormatRolesOfEmployee(1, NULL, NULL) PRINT IdentityRole.FormatRolesOfEmployee(1, '<a href="go.aspx?pkey={0}">{1}</a>', NULL) */ IF OBJECT_ID(N'IdentityRole.FormatRolesOfEmployee') IS NOT NULL DROP FUNCTION IdentityRole.FormatRolesOfEmployee GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集 CREATE FUNCTION IdentityRole.FormatRolesOfEmployee -- 将所有分配给某公司职员的身份角色格式化成一个字符串 ( @pkey int , -- 某公司职员的 PKey @format nvarchar(max) , -- 转换的格式字符串 @separator nvarchar(max) -- 多个身份角色之间的分隔符 ) RETURNS nvarchar(max) AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.IdentityRole].FormatRolesOfEmployee GO ----------------------------------------------------------------------------------------------------- -- 使用指定的格式和分隔符将由指定的 SQL 语句所生成的结果集连接成一个字符串。 /* PRINT ForTable.JoinResultSet('select * from sys.tables', NULL, NULL) PRINT ForTable.JoinResultSet('select * from TOperaPermiCategories', '{1} : {2}', char(13)) */ IF OBJECT_ID(N'ForTable.JoinResultSet') IS NOT NULL DROP FUNCTION ForTable.JoinResultSet GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集 CREATE FUNCTION ForTable.JoinResultSet -- 使用指定的格式和分隔符将由指定的 SQL 语句所生成的结果集连接成一个字符串 ( @sql nvarchar(max) , -- 能生成结果集的 SQL 语句 @format nvarchar(max) , -- 连接时为结果集中每一条记录所指定的格式 @separator nvarchar(max) -- 连接时每一条记录之间的分隔符 ) RETURNS nvarchar(max) AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForTable].JoinResultSet GO ----------------------------------------------------------------------------------------------------- -- 使用指定的格式将由指定的 SQL 语句所生成的结果行连接成一个字符串。 /* PRINT ForTable.JoinResultRow('select ''First'', ''Second'' ; ', NULL) PRINT ForTable.JoinResultRow('select 0 , 1 , 2 , 3 ; ', '{1} : {2}') */ IF OBJECT_ID(N'ForTable.JoinResultRow') IS NOT NULL DROP FUNCTION ForTable.JoinResultRow GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集 CREATE FUNCTION ForTable.JoinResultRow -- 使用指定的格式将由指定的 SQL 语句所生成的结果行连接成一个字符串 ( @sql nvarchar(max) , -- 能生成结果行的 SQL 语句 @format nvarchar(max) -- 连接时所指定的格式 ) RETURNS nvarchar(max) AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForTable].JoinResultRow GO ----------------------------------------------------------------------------------------------------- -- 将指定的变体按指定的格式转换为字符串。 /* PRINT ForVariant.Format(1.2345, '000.0000000') PRINT ForVariant.Format({d'2007-08-08'}, 'yyyy..MM..dd...') */ IF OBJECT_ID(N'ForVariant.Format') IS NOT NULL DROP FUNCTION ForVariant.Format GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集 CREATE FUNCTION ForVariant.Format -- 将指定的变体按指定的格式转换为字符串 ( @variant sql_variant , -- 要进行转换的变体对象 @format nvarchar(max)  -- 转换成字符串所使用的格式 ) RETURNS nvarchar(max) AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForVariant].Format GO ----------------------------------------------------------------------------------------------------- -- 检测在指定的调入仓库和调出仓库之间是否存在有效的的产品调拨操作。 /* PRINT StockpileRelated.HasValidProductDispatchingOperation(1, 2) PRINT StockpileRelated.HasValidProductDispatchingOperation(4, 6) */ IF OBJECT_ID(N'StockpileRelated.HasValidProductDispatchingOperation') IS NOT NULL DROP FUNCTION StockpileRelated.HasValidProductDispatchingOperation GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集 CREATE FUNCTION StockpileRelated.HasValidProductDispatchingOperation -- 检测在指定的调入仓库和调出仓库之间是否存在有效的的产品调拨操作 ( @dispatchIn int , -- 指定的调入仓库的主键标识 PKey @dispatchOut int  -- 指定的调出仓库的主键标识 PKey ) RETURNS bit -- 如果在指定的调入仓库和调出仓库之间存在有效的的产品调拨操作则返回 true,否则返回 false AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.StockpileRelated].HasValidProductDispatchingOperation GO ----------------------------------------------------------------------------------------------------- -- 获取所有对于指定的调入仓库有效的调出仓库。 /* SELECT * FROM StockpileRelated.GetValidDispatchOutWarehouses(1) SELECT * FROM StockpileRelated.GetValidDispatchOutWarehouses(6) */ IF OBJECT_ID(N'StockpileRelated.GetValidDispatchOutWarehouses') IS NOT NULL DROP FUNCTION StockpileRelated.GetValidDispatchOutWarehouses GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集 CREATE FUNCTION StockpileRelated.GetValidDispatchOutWarehouses -- 获取所有对于指定的调入仓库有效的调出仓库 ( @dispatchIn int -- 指定的调入仓库的主键标识 PKey ) RETURNS TABLE ( [PKey] int  ) AS EXTERNAL NAME Assemblies.[Assemblies.Functions.TableValued.StockpileRelated].GetValidDispatchOutWarehouses GO

先记下...

用.NET当然要用CLR,,,

個人態度:作為數據庫沒必要玩CLR,若真需要,應該是前端程式或中間件去處理了 其實這個CLR也是表現的這個特性

我大规模用了,挺好

我们的系统用了。但是只有两个。不敢多用。是用来实现SQL Server不支持的功能。

up

做数据库,没必要用clr

我目前没用CLR,也挻好!

没用过

引用 20 楼 y518 的回复:我大规模用了,挺好 强!!

没用过也没有什么事,挺好的啊

引用 26 楼 ranzj 的回复:引用 20 楼 y518 的回复: 我大规模用了,挺好    强!! 唉。很强啊。兄弟,以后多指教。

引用 10 楼 wangtiecheng 的回复:Agree。 不在自己控制范围下的东西,很难处理。

学习!

是否应用某种技术不应以该技术是否先进为标准,要以是否需要为标准。 有需求、能解决问题的技术就是好技术。

上一篇:急! 急! 安装SQL SERBER 2000 挂起的问题 100yangming_241]
下一篇:SQL Server 2005还没学,听说2008就要出来了 20huangqicai110]

相关文章

相关评论