假设
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就是只有一个连接了?
------解决办法--------------------
如4楼所说,你确实总体上就理解错了。
刨除线程跟单例(实例)的问题,你对DAO、表、数据库连接的概念也混乱了点。
即便只有1张表,那么你只需要定义一个Dao类,而且系统中只有1个Dao实例,你也可以同时有300个数据库连接在处理中。
即便你有10张表,你也可以只定义一个Dao类(不是VO类),系统中也可以只有1个Dao实例,你还是可以同时又300个数据库连接在处理中。
找本书看看吧,我一直主张:如果在基础框架性知识结构中存在不足的话,应该看书以系统性的掌握。
------解决办法--------------------
一个实例和并发性没有多少关系,楼主总是想一个实例的方法就只能有一个业务层对象调用。有多少并发这个对象的这个方法就会有多少个调用。假设启动30个线程同时调用一个对象的同一个方法,这种情况按楼主错误的理解就是只能串行访问了。
------解决办法--------------------
“既然dao层为单例,那么是不是每一个dao,有且只有一个实例,每一个实例只占用一个数据库连接,”
你对单利理解有误,或者说java方法的执行理解有误;
请问你如何获取connection?
假如是-getconnection();那么无论是否单利,每执行一次都会创建一个connection连接;
单利是用来就是用来节省内存的