javaweb多用户访问

Lyle 2014-07-22 10:54:35
javaweb项目,ssh架构,目前有两个数据源:本地数据源,动态数据源。
项目中大多数的功能都是要连接外面的数据库完成的,因此在我的本地数据库里有一个表用来记录多个数据源信息,当需要访问一个外部数据时,会取到外部数据源的信息,然后修改动态数据源的参数,以完成对外部库的操作。
问题:
现在用户多了,当一个用户在执行查询操作的时候,由于数据量较大,有比较长的等待时间,正在等待的时候,另一个用户访问别的外部数据将动态数据修改了,这样前一个用户的数据源就被修改了致报错。
如果为每一个外部库都写一个连接,是不现实的,实在太多。
请教有没有好的方面可以避免这种情况的发生。
...全文
668 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoyilin1 2016-10-12
  • 打赏
  • 举报
回复
我也是在做这类东西,我是学生党,敢问一下,要是实现多人在线,方法需要重写吗?我粘一个我项目的方法,麻烦看一下能不能用 @Override public Consumption findByTag(Consumption consumption) { // TODO Auto-generated method stub String hql="from Consumption where die=0 and tag=1 and iccard.icid='"+consumption.getIccard().getIcid()+"'"; Query query = sessionFactory.getCurrentSession().createQuery(hql); @SuppressWarnings("unchecked") List<Consumption> list = query.list(); Consumption consumption2 = list.get(0); return consumption2; }
MiceRice 2014-08-19
  • 打赏
  • 举报
回复
数据库连接池,规模经常都会在 100~400,所以你这个数据源大概100多个,不算很大问题。 不过写连接池确实需要较强的技能和不低工作量,如果手头资源不足,不是很推荐。 简易点的办法就是,控制好服务线程数,比如50个。每个线程自己负责管理自己独享连接(也就是只有它自己去改,别的线程不准改),需要访问哪个数据库就临时去建立连接,用完了线程自己释放掉。 简易方案性能较差,上线后同步安排资源开发连接池。连接池无非几个动作: 1、接获某线程关于某库A的连接申请; 2、查找池中闲置连接中有无刚好是该库A的连接;有则直接返回该连接; 3、查找池中闲置连接最长的连接,关闭它,然后修改其连接A库,然后返回该连接; 4、等待池中出现闲置连接,并注意设置超时时间; 附注:第2步需要测试下该连接是否存活(有时候会意外关闭),如果断开了就要重连,再给回线程。 以上动作需要重新包装Connection等,而且操作不当会出现泄漏等问题,所以要谨慎测试。
Lyle 2014-08-19
  • 打赏
  • 举报
回复
引用 7 楼 ldh911 的回复:
[quote=引用 楼主 xf_luyao 的回复:] 如果为每一个外部库都写一个连接,是不现实的,实在太多。
不知道你这个多到底有多少,难道是数十万个? 首先需要确认的是,你是否可以为每个线程提供一个数据库连接(动态数据源),确保线程之间不要互相混用。 另一个层面则是自己写一个连接池,共享为数不多的几个数据库连接,连接池管理好复用问题。如果某连接没有用完释放(close()),则阻塞下一个申请连接的线程,直到上一个连接被释放;最后还要注意申请连接的超时机制。[/quote] 数据源大概有100多个,我也考虑过写5个数据源,操作时如果第1个数据源没有释放,就连接第2个,以此类推,具体的实现还不是很清晰
Lyle 2014-08-19
  • 打赏
  • 举报
回复
引用 6 楼 xiangyuecn 的回复:
没看懂动态数据源是什么东东,是很多个不确定访问地址的数据库吗
访问地址是确定的,只是要一直修改数据源参数,以达到访问不同数据库的效果。
高坚果兄弟 2014-07-23
  • 打赏
  • 举报
回复
没看懂动态数据源是什么东东,是很多个不确定访问地址的数据库吗
MiceRice 2014-07-23
  • 打赏
  • 举报
回复
引用 楼主 xf_luyao 的回复:
如果为每一个外部库都写一个连接,是不现实的,实在太多。
不知道你这个多到底有多少,难道是数十万个? 首先需要确认的是,你是否可以为每个线程提供一个数据库连接(动态数据源),确保线程之间不要互相混用。 另一个层面则是自己写一个连接池,共享为数不多的几个数据库连接,连接池管理好复用问题。如果某连接没有用完释放(close()),则阻塞下一个申请连接的线程,直到上一个连接被释放;最后还要注意申请连接的超时机制。
致知Fighting 2014-07-22
  • 打赏
  • 举报
回复
你的动态数据源为什么要用单例 系统启动的时候把数据源都封装好,你可以为每一个数据源封装一个连接池,也可以自己来管理所有的链接<String, DataSource>
wqc5461 2014-07-22
  • 打赏
  • 举报
回复
动态数据源不能使用单例。 必须得动态创建,才能支持并发。
wnf2009 2014-07-22
  • 打赏
  • 举报
回复
数据库连接池~~~~~~~~~开源的很多
S117 2014-07-22
  • 打赏
  • 举报
回复
用个数据库连接池呀,C3P0什么的都可以
zy_think123 2014-07-22
  • 打赏
  • 举报
回复
不要用单例就好了,本来web程序就是多线程的,你用个单例干啥?

81,094

社区成员

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

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