数据库连接池和session
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池和session相关的知识,希望对你有一定的参考价值。
现在生产环境出现这种情况,刚一登陆系统中,就提示session失效需要重新登录(session失效时间设置没有问题),这个会不会与连接池有关系?请给出详细原因,谢谢
是什么session失效?如果是http session失效,而且你用的是iis,估计是因为采用了多web园。因为每次http连接有可能达到不同的web园,而web园之间的session是不通的,因此导致失效。解决办法就是采用单一web园,或不采用session。追问我们用的是weblogic服务器,并且应用部署了两台机器,有些用户会出现登入系统,立刻会提示登陆失效,其他的我也不是很清楚了。生产环境从来没接触过。。。
追答估计就是因为2台的原因,session在2台间不是互通的,所以丢失,具体要找厂家。
参考技术A session与连接池有关系的话就只能是没有从数据库里面取到值。你可以直接在程序里面赋给session一个值。看看你取SESSION哪里有没有问题。一般来说只要数据库能查询。连接池与session无关的 参考技术B 你系统是什么架构的?中间有没有路由?是否涉及消息转发?聊聊连接池和线程
一、连接池
1、什么是连接池?我们为什么需要它?
连接池允许多个客户端使用缓存起来的连接对象,这些对象可以连接数据库,它们是共享的、可被重复使用的。
打开/关闭数据库连接开销很大,连接池技术允许我们在连接池里维护连接对象,这样可以提高数据库的执行命令的性能。多个客户端请求可以重复使用相同的连接对象,当每次收到一个客户端请求时,
就会搜索连接池,看看有没有闲置连接对象。如果没有,要么所有的客户端请求都进入队列排队,要么在池中创建一个新的连接对象(这取决于池里已有多少个连接存在以及配置支持多少连接)。
一旦某个请求使用完连接对象之后,这个对象会被重新放入池中,然后会被重新分派给排队等待的请求(分派给哪个请求要看使用什么调度算法)。
因为大部分请求都是使用现存的连接对象,所以连接池技术大大减少了等待创建数据库连接的时间,从而减少了平均连接时间。
连接池在基于网络的企业级应用中很常见,应用服务器负责创建连接对象、添加它们到连接池中,分派连接对象给请求,回收使用完毕的连接对象,重新将它们放回连接池去。
当网络应用创建数据库连接时,应用服务器会从池中取出连接对象,而当它使用完毕之后关闭时,应用服务器又负责将使用完的连接对象放回池中。
PS:也可以使用JDBC 1.0/JDBC 2.0 API来获取物理连接(physical connnection),但这种情况非常少见,因为数据库只需要连接一次,不需要连接池的情况。
可以进行配置最大的连接数、最小连接数、最大空闲连接数等,所有这些参数都可以由服务器管理员配置。服务器启动时,固定数量的连接对象(配置的最小连接数)被创建,并添加到连接池中。
当客户端请求消耗完所有的连接对象时,再有新的请求都会创建新的连接对象,它们被添加到连接池再分派给这个新的请求,直到设置的达到最大的连接数。
服务器也会一直查看闲置的连接对象数,当检测到闲置的连接数超过设置值时,服务器会关闭闲置连接,然后它们将被垃圾回收。
连接池是个开放的概念,任何应用都可以使用这个概念,并用自己想要的方式管理它。连接池概念指的是创建、管理、维护连接对象。
但当应用的规模增大时,如果没有一个健壮的连接池机制的话,管理连接是会得越来越困难。
因此,建立一个健壮的、可管理的连接池很有必要。
PS:关于连接池的内容,参考自http://www.importnew.com/8179.html
二、线程&线程池,连接&连接池
线程:程序执行流的最小单元,进程中的一个实体,一个相对独立的、可调度的执行单元,是被系统独立调度和分派的基本单位;
多线程技术,指在一个进程当中可以创建多个线程来“同时”处理多个事务;
线程池:可以理解为缓冲区,由于频繁的创建销毁线程会带来一定的成本,可以预先创建,但不立即销毁,以共享方式为别人提供服务,一来可以提供效率,再者可以控制线程无线扩张。
连接:指一点与另一点的连接;
连接池:跟线程池有同样的妙处,但连接池可以是基于多线程来实现,也可以通过多进程来实现,也可能是单实例的。
举个例子:
Socket在做为服务时,可以同时监听多个客户端连接,那么它的实现原理就有点像“连接池”;每个客户通过多个端口同时向服务器发送数据,可以认为是多线程,
而服务器可能已经建立好了n个线程来等待同时处理/分析客户端发来的数据,可以为是有个“线程池”。
以上是关于数据库连接池和session的主要内容,如果未能解决你的问题,请参考以下文章