filter过滤器并发问题

liuxiaohui1987 2010-01-11 02:28:46
我有个web工程,具体操作就是每次请求过来就做几次数据库的读写操作,做几次文件的读写操作。
1.web工程用到一个过滤器filter,一个请求过来先由这个过滤器处理一次然后在进行后面的操作,现在担心如果并发大的话filter会不会有问题?
2.在filter和servlet之间传递值的时候是用request.setattribute还是session.setattribute比较好?
3.工程里用到了数据库连接池(最多100个链接),一次请求过来后处理这个请求我要去操作数据库4次,现在我想是每次操作数据库时去链接池拿一条连接还是一直用一个链接(每次需要操作数据库时只是传递这个链接的对象过去)?
以上问题都是担心并发大的时候会出问题,希望大家给解释一下。
...全文
489 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxiaohui1987 2010-01-12
  • 打赏
  • 举报
回复
我的数据库链接池是这么用的,就是在每个请求来了都拿一条链接,filter,servlet里的链接都是用的这一条,因为请求先到的filter,就先在filter里创建这个链接,用完就把这个链接用request.setAttribute("dp",dp)的对象传给servlet,servlet取到这条链接,在servlet里不管是select,还是insert都是用的这条链接,用的时候只是把这条链接的对象传过去。
最后执行完servlet后经过filter(after方法里还要用这链接)里用完在关掉。
大家说说这样的用法可以吗?谢谢。
liuxiaohui1987 2010-01-12
  • 打赏
  • 举报
回复
我的filter是这么写的:
request--->filter(befor方法)--(修改后的数据)-->servlet
servlet(执行完后)--(修改后的数据)-->filter(after方法)
(工程里有多个servlet,都共用这一个filter,servlet和filter之间有数据交互)
这样会不会对多并发或线程同步用影响?
小弟才疏学浅,麻烦解释一下,谢谢各位
xusheng1018 2010-01-11
  • 打赏
  • 举报
回复
Filter 是单例模式的,是线程同步的,不会有并发问题
liuxiaohui1987 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bao110908 的回复:]
你的 Filter 中不能含有状态的成员变量,否则的话会产生并发问题,因为 filter 是单例形式的,仅在启动时初始化一次。

如果你的 Filter 中没有状态变量的话,那不用担心会产生并发问题。

应该使用 request.setAttribute,没事不要随便往 session 中塞东西。

至于用到几次数据库连接,这需要看你的代码具体是怎么写的。
[/Quote]
先谢谢
我写的filter会和servlet有数据传递,也就是说,在执行完servlet后servlet会把一些数据传递给filter(After方法)去再操作,servlet和filter之间的这种操作会对并发有影响吗?
liggway 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 liuxiaohui1987 的回复:]
我有个web工程,具体操作就是每次请求过来就做几次数据库的读写操作,做几次文件的读写操作。
1.web工程用到一个过滤器filter,一个请求过来先由这个过滤器处理一次然后在进行后面的操作,现在担心如果并发大的话filter会不会有问题?
2.在filter和servlet之间传递值的时候是用request.setattribute还是session.setattribute比较好?
3.工程里用到了数据库连接池(最多100个链接),一次请求过来后处理这个请求我要去操作数据库4次,现在我想是每次操作数据库时去链接池拿一条连接还是一直用一个链接(每次需要操作数据库时只是传递这个链接的对象过去)?
以上问题都是担心并发大的时候会出问题,希望大家给解释一下。
[/Quote]

1,filter像servlet一样都是多线程的,除非你有共享数据和同步,否则不会有并发问题
2,request的生命周期是一次请求;
session则是存在于整个会话期;
3,使用连接池的话每次getconnection都会获得一个连接,不一定是原来的,不需要考虑性能问题,连接的创建和销毁才是最耗资源的,是否需要使用同一个连接取决于事务。
beiouwolf 2010-01-11
  • 打赏
  • 举报
回复
filter是单例的 并且是线性处理的
既然你用了连接池,连接管理就不应该和你有关系了
  • 打赏
  • 举报
回复
你的 Filter 中不能含有状态的成员变量,否则的话会产生并发问题,因为 filter 是单例形式的,仅在启动时初始化一次。

如果你的 Filter 中没有状态变量的话,那不用担心会产生并发问题。

应该使用 request.setAttribute,没事不要随便往 session 中塞东西。

至于用到几次数据库连接,这需要看你的代码具体是怎么写的。
qianmz 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 maer56 的回复:]
首先你要理解一个概念,先Filter后Servlet
request.setattribute放临时的,
session.setattribute放贯穿整个网站的,简单的说就是购物栏,或者登陆信息
[/Quote]
数据库连接可以用jndi
maer56 2010-01-11
  • 打赏
  • 举报
回复
Request是你的一个请求,请求完了,就结束了,你request.setattribute了也只存活于从你请求到结束之间
Session是在服务器保存一定时间的,一般30分钟,若果空闲(指客户端没有新的请求)30分钟,才会结束。
缓存方面(Session就可以算是一个缓存),你可以百度一下,说白了,就是存储缓存的时间和当前的时间比较,如果过期,就操作什么。没过期就取你缓存的对象
liuxiaohui1987 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 maer56 的回复:]
首先你要理解一个概念,先Filter后Servlet
request.setattribute放临时的,
session.setattribute放贯穿整个网站的,简单的说就是购物栏,或者登陆信息
[/Quote]
那request.setattribute就可以,并不需要这个值存活那么长时间
liuxiaohui1987 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 maer56 的回复:]
并发不会有问题,和Servlet一个道理,要有问题肯定也是线程同步问题,或者是服务器设置问题。这和技术选择没关系。和你业务逻辑有关。
你如果闲数据库查询次数过多,可以使用缓存,将不经常变化的查询信息缓存起来,要取信息,就先判断缓存里有没有,没有就向数据库查询并放入缓存。有的话,直接获取。
[/Quote]
谢谢你,不是很懂这个“缓存”的问题....
线程同步还是有很多疑虑,怎么避免线程同步出问题呢?
maer56 2010-01-11
  • 打赏
  • 举报
回复
首先你要理解一个概念,先Filter后Servlet
request.setattribute放临时的,
session.setattribute放贯穿整个网站的,简单的说就是购物栏,或者登陆信息
maer56 2010-01-11
  • 打赏
  • 举报
回复
并发不会有问题,和Servlet一个道理,要有问题肯定也是线程同步问题,或者是服务器设置问题。这和技术选择没关系。和你业务逻辑有关。
你如果闲数据库查询次数过多,可以使用缓存,将不经常变化的查询信息缓存起来,要取信息,就先判断缓存里有没有,没有就向数据库查询并放入缓存。有的话,直接获取。

81,091

社区成员

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

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