filter过滤器并发进程同步问题 比上贴介绍详细,谢谢

liuxiaohui1987 2010-01-12 09:51:27
我有个web工程,具体操作就是每次请求过来就做几次数据库的读写操作,做几次文件的读写操作。
1.web工程用到一个过滤器filter,一个请求过来先由这个过滤器处理一次然后在进行后面的操作,现在担心如果并发大的话filter会不会有问题?
2.在filter和servlet之间传递值的时候是用request.setattribute还是session.setattribute比较好?
3.工程里用到了数据库连接池(最多100个链接),一次请求过来后处理这个请求我要去操作数据库4次,现在我想是每次操作数据库时去链接池拿一条连接还是一直用一个链接(每次需要操作数据库时只是传递这个链接的对象过去)?
我有个web工程,具体操作就是每次请求过来就做几次数据库的读写操作,做几次文件的读写操作。


我的filter是这么写的:
request--->filter(befor方法)--(修改后的数据)-->servlet
servlet(执行完后)--(修改后的数据)-->filter(after方法)
(工程里有多个servlet,都共用这一个filter,servlet和filter之间有数据交互)
这样会不会对多并发或线程同步用影响?


我的数据库链接池是这么用的,就是在每个请求来了都拿一条链接,filter,servlet里的链接都是用的这一条,因为请求先到的filter,就先在filter里创建这个链接,用完就把这个链接用request.setAttribute("dp",dp)的对象传给servlet,servlet取到这条链接,在servlet里不管是select,还是insert都是用的这条链接,用的时候只是把这条链接的对象传过去。
最后执行完servlet后经过filter(after方法里还要用这链接)里用完在关掉。
大家说说这样的用法可以吗?
小弟才疏学浅,麻烦解释一下,谢谢各位

...全文
223 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxiaohui1987 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sgl1984 的回复:]
连接池当然是web工程里所有的servlet共用,因为连接池是单例模式,他的创建开消是很大的,所以对于一个工程而言,一般都只有一个数据库连接池的。
另外,你说“我在filter创建了一个链接池对象”,这句话有问题,实际情况是,你应该用JNDI方式,让服务器为你建一个链接池对象(推荐),你只负责去取这个对象就是了,而且注意,整个过程中有且只有这么一个连接池对象,因为刚才说了,他是单例模式的。
[/Quote]
哦,如果我放到filter中去创建,每次来请求每次走filter就创建一个连接池对象,这样是开销很大。
那个JNDI方式没接触过,回去看看,谢谢,希望您多给点意见。
sgl1984 2010-01-13
  • 打赏
  • 举报
回复
连接池当然是web工程里所有的servlet共用,因为连接池是单例模式,他的创建开消是很大的,所以对于一个工程而言,一般都只有一个数据库连接池的。
另外,你说“我在filter创建了一个链接池对象”,这句话有问题,实际情况是,你应该用JNDI方式,让服务器为你建一个链接池对象(推荐),你只负责去取这个对象就是了,而且注意,整个过程中有且只有这么一个连接池对象,因为刚才说了,他是单例模式的。
liuxiaohui1987 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sgl1984 的回复:]
引用 1 楼 sunnylyy 的回复:
可以,如果并发量不大。
用ThreadLocal代替request.setAttribute存储数据库连接会更好些,不单单是servlet中能用到数据库连接。

用ThreadLocal是个不错的主意,但我不明白,为什么把问题搞得那么麻烦。
既然你已经用到了连接池,我想从池里面重新去拿连接与你将连接放入ThreadLocal中再去拿,开销是差不多的,连接池实际上就是一个大的map或table,ThreadLocal本质上也就是一个map,没必要想这么多。
个人认为,filter中用一个连接,用完还给连接池,到了servlet中重新从池中去拿。
实际想想,如果并发量真大的话,你老把连接占用着,反而不利。
[/Quote]
谢谢,能帮我看一下2楼的问题吗?
youlaiyouwang 2010-01-12
  • 打赏
  • 举报
回复
我没经过大数据量的测试,学习。
sgl1984 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunnylyy 的回复:]
可以,如果并发量不大。
用ThreadLocal代替request.setAttribute存储数据库连接会更好些,不单单是servlet中能用到数据库连接。
[/Quote]
用ThreadLocal是个不错的主意,但我不明白,为什么把问题搞得那么麻烦。
既然你已经用到了连接池,我想从池里面重新去拿连接与你将连接放入ThreadLocal中再去拿,开销是差不多的,连接池实际上就是一个大的map或table,ThreadLocal本质上也就是一个map,没必要想这么多。
个人认为,filter中用一个连接,用完还给连接池,到了servlet中重新从池中去拿。
实际想想,如果并发量真大的话,你老把连接占用着,反而不利。
liuxiaohui1987 2010-01-12
  • 打赏
  • 举报
回复
谢谢,楼上,还有个链接池的问题
我在filter创建了一个链接池对象,那么这个链接池是这个web工程里所有的servlet共用吗?
sunnylyy 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 liuxiaohui1987 的回复:]
.....

我的数据库链接池是这么用的,就是在每个请求来了都拿一条链接,filter,servlet里的链接都是用的这一条,因为请求先到的filter,就先在filter里创建这个链接,用完就把这个链接用request.setAttribute("dp",dp)的对象传给servlet,servlet取到这条链接,在servlet里不管是select,还是insert都是用的这条链接,用的时候只是把这条链接的对象传过去。
最后执行完servlet后经过filter(after方法里还要用这链接)里用完在关掉。
大家说说这样的用法可以吗?
小弟才疏学浅,麻烦解释一下,谢谢各位


[/Quote]

可以,如果并发量不大。
用ThreadLocal代替request.setAttribute存储数据库连接会更好些,不单单是servlet中能用到数据库连接。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧