论坛首页 编程语言技术论坛

rails中opensessioninview(数据库链接是否在views层还开启)

浏览 7778 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-09-06   最后修改:2011-09-06
opensessioninview好像是hibernate的概念,我只是想形容一下这个问题:其实就是在视图层是否关闭数据库链接。

rails中将model传到views层
例如学生与课程关系:
students = Students.all

这个时候我还是可以再views层使用
students.each do |stu|
  stu.clazz.name
end


再views可以进行sql查询(也就是懒加载问题),如果views在传输过程中因为网络原因堵塞,会照成数据库链接没有及时释放。

问一下,我现在可以在views上使用这种查询,输出名字,也就是说明rails的数据库链接再views输出后才关闭,是不是意味着程序有可能出现数据库链接没有及时释放问题。


各位,- -# 不要投新手贴,这个问题好像在论坛中没有讨论....希望和大家讨论一下
   发表时间:2011-09-07  
大家没有这样的疑问么? 求解呀,我已经在翻源码,不过还没有确定问题
0 请登录后投票
   发表时间:2011-09-07  
不要用java的思想来学习rails.

0 请登录后投票
   发表时间:2011-09-08  
qichunren 写道
不要用java的思想来学习rails.



额,其实是这样的,我只想知道rails在views层数据库链接是否还保持。。

java的问题也好 rails的问题也好,在views层保持数据库链接对于互联网应用将会是致命的(感谢中国的网络环境),数据库链接无法及时释放会造成系统瓶颈。

当然局域网项目可能这种问题体现的不是很明显
0 请登录后投票
   发表时间:2011-09-08  
daigong 写道

java的问题也好 rails的问题也好,在views层保持数据库链接对于互联网应用将会是致命的(感谢中国的网络环境),

java也好,rails也好,网络问题都不是open session in view的问题,因为前端有web server,而后端的应用在完成view渲染以后,会直接将内容放入到web server buff中,用户网络再慢也不会拉长数据库链接的保持时间。
0 请登录后投票
   发表时间:2011-09-08   最后修改:2011-09-08
view渲染成html,然后在发到web server的。
0 请登录后投票
   发表时间:2011-09-08   最后修改:2011-09-08
QuakeWang 写道
daigong 写道

java的问题也好 rails的问题也好,在views层保持数据库链接对于互联网应用将会是致命的(感谢中国的网络环境),

java也好,rails也好,网络问题都不是open session in view的问题,因为前端有web server,而后端的应用在完成view渲染以后,会直接将内容放入到web server buff中,用户网络再慢也不会拉长数据库链接的保持时间。


我以前也是这么认为的,不过前几天我做了个很简单的实验,再jsp页面上写一个循环,输出字符“asdadaasdassadasdasdasd”,循环次数为10000*10000次

页面并不是像我们想象一样,先将jsp生成html,然后给用户,而是一边执行程序,当buffer满了之后,网络IO输出一次,然后继续执行程序,页面上有一个属性可以设置buffer,

<%@ page buffer="5kb" %>

此外如果在jsp上调用
out.flush();

也可以人工强制执行IO,只要是网络IO传输一次,就有可能照成网络阻塞,页面等待,jsp 是这样,rails也是好像也是如此,因为无法与之buffer需要多大,这种机制就有可能发生因为页面网络IO阻塞,导致数据库链接没有及时释放。

即便前段有nginx或者apache,buffer总是有大小限制的,如果没有限制,页面放在内存里面,并发访问上来了,内存岂不是撑不住了?

大家尝试一下这种case,如果是我理解错误,希望大家帮忙指出,多谢!


0 请登录后投票
   发表时间:2011-09-08  
nginx 用 proxy_pass 给后端的tomcat或者ruby fastcgi,默认的proxy_buffering是开启的,如果真的遇到极大页面size超过buffer size,nginx会放到硬盘上生成临时文件,所以不用当心内存的问题。
0 请登录后投票
   发表时间:2011-09-08  
QuakeWang 写道
nginx 用 proxy_pass 给后端的tomcat或者ruby fastcgi,默认的proxy_buffering是开启的,如果真的遇到极大页面size超过buffer size,nginx会放到硬盘上生成临时文件,所以不用当心内存的问题。


如果是这样我就想通了,那我可不可以这样认为,如果是java Tomcat来容器,使用hibernate opensession 就会出现数据库没有及时释放的问题,而使用nginx之后就不会这样了。

还想问下,除了nginx,apache和lightd 也是有类是机制的吧?这个机制我想了解的话如何去google。。 有没有什么术语

谢谢帮我解除这个疑问,困扰了我好久,呵呵
0 请登录后投票
   发表时间:2011-09-08  
lighttpd和nginx都有,apache我没有用过,不太清楚。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics