现有一WEB项目(STRUTS2+SPRING),Action中存在这样的业务逻辑:执行的过程中需要连接不同的数据库(不同机器上的不同种类的数据库)、还需要连接几个不同的C/S项目的服务器端进行数据交互。
现在请问下:对于这些Socket和Connection,是在用户登陆时一次性连接好,放入Session或者Application中备用(因为不是每一个Action都需要连接这么多东西进行交互);还是在具体的Action中现用现申请,使用完了立即close。那种方案更好点(包括效率,稳定性,安全性)。希望各位大侠能来讨论讨论。

解决方案 »

  1.   

    这个要看情况的,具体问题具体分析,我就我做过的或是碰到过的项目的做法给楼主分析下:
    (一)
    如果针对别的数据库/Socket服务(这里不区分db connection 和socket connection,本质上来说是一样的)的业务量大,实时性要求高,那么就在项目启动(比如你这里的web项目)的时候,按各个服务器允许你这个项目连接的最大连接数的1/2~2/3建立好连接放在连接池(Application级别,因为一般不针对单个项目的某个用户--即此处楼主所指session--来建立连接,比如不能把数据库用户和web项目用户混为一谈),剩余的1/2~1/3由连接池来控制生成。如果允许最大在10个以内,则一把全部初始化好连接放连接池,这样能够做到效率最高。稳定性的话,在这种情况下应该由连接池来保证连接的有效性,比如超时释放空闲连接,断线重连,socket连接的heartbeat保证连接有效等等。安全性:如果不是在公网,一般不对其进行加密解密,因为加密解密需要耗时,公网一般建议加密解密,加密解密在socket连接用的比较多,比如包头包尾加验证的sessionkey,数据库连接一般用不到(大多数数据库厂商提供了安全认证,而你又希望牺牲效率来保证安全除外)。
    (二)
    本项目针对其他数据库或者socket服务的业务量不大,实时性要求也不高,则采取即用即连接即关闭的方式来做。这种方式的最大弊端就是慢,因为连接服务器总是需要消耗太长的时间稳定性,一般是连续3次连接不成功则放弃。至于安全性,看你需要是否进行加密解密,没有必须的说法。
    (三)
    同一项目中包含以上两种情况,则分而治之,按需求来分别对待。
    以上经验在我做过的不少于10个大中型项目(100w合同额以上)及数十个小项目中无一例外希望这些经验能提供些启示,楼主看着办吧。
    结帖率100.00%,这种楼主值得多打些字,哈哈。
      

  2.   

    socket连接是长连接性能好
    数据库也是基于tcp/ip,所以也是一种socket,你可以用telnet试一试所有,最好的是保持连接,用连接池
      

  3.   

    http://lgh3292.javaeye.com/blog/283425这里楼主可以参考。