对于database pooling实现我一直比较迷惑
我试了一下,在允许对象共用的情况下用100个线程向数据库插数据:
将database的keepconnection设为true 通过监测器 我发现 数据库没有进行 reset_connection 
而如果设为false的话 就会有不断的reset_connection 效率也没有上面的高,虽然不是差很多。可是李为跟borland的手册都建议将keepconnection 设为false!?
请高手解答:)  

解决方案 »

  1.   

    这个考虑的情况可能是如果你的操作不是很频繁的话,keepconnection=true还会占用着资源不释放,浪费了资源,因此建议使用keepconnection=false,如果碰到操作很频繁的话,keepconnection=true会好一点。
        一家之言,请勿见笑
      

  2.   

    COM+ 的 pooling 机制我也迷惑每次发贴都花了我不少时间, 还要跟贴. so 多几句费话说明 object pooling 和 resource pooling object pooling 对象池化
    基本实现的方式是 建立一个对像池, 客户请求后从池中找出一个空闲中的对像服务, 完成请求后把对像放回池中等待下一次请求.resource pooling 资源池化
    跟对像池化的方式基本一样, 所不同的是有些资源是有限的,不像 object pooling 可以再建立一个临时的 object 服务后立即释放, so 只好排队, 有限资源可以用信号量 (Semaphore)表示.
    数据库中连接资原是有限的(有多少我不知道)
    事务资源是有限的, ms sqlserver, oracle, sybase 等数据库都少得可怕, 原因是使用了 table lock 事务机制, 一个表只能有一个事务, 呵呵吓到看官了没? 还好这类数据库的死锁机制作得好, 不起眼的 borland interbase 却是 record lock, 事务机制很好,可惜没什么人爱用以下开始讨论但肯定的是如果是 object pooling那么 KeepConnection 应是 true, 因为 pooling 后的对像不可能不频繁使用, 所有的客户请求都被分配到了空闲对像, 如果每次都 reconnection 那 object pooling 就没有意义, 除非非常有限的资源, 但Connection 基本上可以看作是无限数量如果是 resource pooling 
    那么此时只 pooling 了事务资源, 那就没什么意义了, KeepConnection 设成 false 只是进一步节约资源(主要节约内存资源), 资源占用的大户(内存) "COM + Object"而没有节约到. 但这种情况设 KeepConnection 为 false 仍是好习惯
      

  3.   

    感谢comanche(太可怕)提供了概念解释,苹果学习中......
      

  4.   

    谢谢comanche(太可怕)详细的解释
    那么李维说的用object pooling 的方式来实现database pooling就是你说的那个意思了?
    另外请问:com+ manager 中设置对象公用后是否就代表实现了object pooling ?学习中
      

  5.   

    COM + 中的 pooled 是否有效是很难明确的
    通过以下观察是可以得出结论的
    1. 设 KeepConnection = true 后看, SQL monitor 应该不会有连接释放语句,很长时间也不应有(实际跟组件服务的一些设置有关, 太小的cache连接数和太大的最大连接数都会引起, Connection 释放, so 这不是标识性的参考标准)2. 看线程数量, 在任务管理器中(95/98是没可能了), 进程->查看->选择列 把线程计数 check 上, 跟踪线程时,一个连接跟十个不活跃连接的线程应该是一样可以看出 COM+ 有实现 database pooling, 但好像效率上不太行呵
    但有多个 RDM 时就有些置疑了,具体如何你应亲自试试
      

  6.   

    结了呵, 不知道你还有没看贴
    近两天试了试 COM+/MTS 可以实现 object pooling
    我在作法在
    http://expert.csdn.net/Expert/topic/1264/1264460.xml?temp=.7255518