当前位置: 代码迷 >> 高性能WEB开发 >> SSH架构,dao层是不是一定要是单例模式
  详细解决方案

SSH架构,dao层是不是一定要是单例模式

热度:651   发布时间:2014-01-22 00:03:39.0
SSH架构,dao层是否一定要是单例模式。
本帖最后由 u011042069 于 2013-12-30 11:52:35 编辑
   
   假设 
   
   web服务器使用tomcat,修改最大并发数为300。

   数据库使用mysql,修改最大并发数为300。

   连接池为c3p0,最大连接数也是300。

   使用ssh架构。

   struts2 的action为原型。

   service,dao,为单例。


       问题1:既然dao层为单例,那么是不是每一个dao,有且只有一个实例,每一个实例只占用一个数据库
   
       连接,由于业务简单,只有30个表和dao,那么就只会占用30个数据库连接?会不会浪费。

       问题2:既然tomcat,的最大并发,和数据库的最大并发,已经设置的相同了,能不能把dao和

       service,也设置为原型?假设业务简单,每个action的请求,只调用了一个service和一个dao,

       是不是每次请求只建立个一个数据连接?

       问题3:是不是hibernate中的每一个session都,占用一个数据库连接?那么它占用连接时间是多久?

        或者说它占用的周期是什么?送session生成到,session对象没销毁?

   

   

------解决办法--------------------
问题1:既然dao层为单例,那么是不是每一个dao,有且只有一个实例,每一个实例只占用一个数据库连接,由于业务简单,只有30个表和dao,那么就只会占用30个数据库连接?会不会浪费。
―― 数据库连接是使用时才申请,用完立即释放;所以占用多少个连接取决于应用当前的并发数。


问题2:既然tomcat,的最大并发,和数据库的最大并发,已经设置的相同了,能不能把dao和service,也设置为原型?假设业务简单,每个action的请求,只调用了一个service和一个dao,是不是每次请求只建立个一个数据连接?
―― 一般来说是每个请求只一个数据库连接即可完成服务,不排除特殊业务需要同时操作多个数据库;


问题3:是不是hibernate中的每一个session都,占用一个数据库连接?那么它占用连接时间是多久?或者说它占用的周期是什么?送session生成到,session对象没销毁?
―― 是的每个session都要占用一个连接;占用到你关闭为止(如果用模板来访问的话,则是自动关闭);
------解决办法--------------------
[code=sql]
引用
[/code]
------解决办法--------------------
单例跟单线程没有关系的,这点你估计是搞混了。
ActionServlet也是单例的(高版本的好象不是了),按你的想法用了struts就是只有一个连接了?
------解决办法--------------------
引用:
dao层为单例,该应用有30个表,那么,就是只有30个dao的实例在内存中,每个dao实例同时最多占用一个数据库连接。也就是说,不管web应用并发了多少个数据库请求(肯定都是由dao发出的),那么最多也只能同时并发30个数据库请求。假设我的数据库可以抗住300个并发,那也是没有意义的。这样显然是不合理的啊。我哪里理解错了?


如4楼所说,你确实总体上就理解错了。

刨除线程跟单例(实例)的问题,你对DAO、表、数据库连接的概念也混乱了点。

即便只有1张表,那么你只需要定义一个Dao类,而且系统中只有1个Dao实例,你也可以同时有300个数据库连接在处理中。
即便你有10张表,你也可以只定义一个Dao类(不是VO类),系统中也可以只有1个Dao实例,你还是可以同时又300个数据库连接在处理中。

找本书看看吧,我一直主张:如果在基础框架性知识结构中存在不足的话,应该看书以系统性的掌握。
------解决办法--------------------
一个实例和并发性没有多少关系,楼主总是想一个实例的方法就只能有一个业务层对象调用。有多少并发这个对象的这个方法就会有多少个调用。假设启动30个线程同时调用一个对象的同一个方法,这种情况按楼主错误的理解就是只能串行访问了。
------解决办法--------------------
“既然dao层为单例,那么是不是每一个dao,有且只有一个实例,每一个实例只占用一个数据库连接,”
你对单利理解有误,或者说java方法的执行理解有误;
请问你如何获取connection?
假如是-getconnection();那么无论是否单利,每执行一次都会创建一个connection连接;

单利是用来就是用来节省内存的
  相关解决方案