数据库中session
1. 在Oracle中session和process的区别
Oracle中session和process区别:
一个数据库的Connect可以有一个或多个session,同时connect也可以有一个或多个process。
在专业服务器连接方式中,一个session对应一个process,在共享服务器方式中,一个process可以为多个session。
一个session也可以存在若干个process中,并行同样是一个session对应一个process,主session是coordinator session,每个parallel process同样会对应数据库里一个单独的session。
可以从v$px_session和v$session查看。
比如某客户端连接数据库的session和process的值:
sql">select*fromv$sessionwhereterminal='RUIFEI';
和
select*fromv$process
whereaddrin
(selectpaddrfromv$sessionwhereterminal='RUIFEI');
如果是专用服务器方式连接,session和process是一样的。
连接connects,会话sessions和进程pocesses的关系:
每个sqllogin称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。
oracle中系统process和session的关系:
在SharedServer中的Process 和Oracle 中的Session不是一一对应的,Shared Server中的Process 一个对应着Oracle 中的一个或者一个以上的Session。
数据库的session和操作系统process是对应的。
即表示一个session对应一个process,但是一个process未必对应一个session。
2. 一个数据库支持程度最大的SESSION是多少
session存在服务器端,安全,可存一些复杂的数据,但是占用服务器内存或数据库资源,和页面跳转没有关系,一个用户一个session。
应用场合是不同的,ViewState只限制在当前页面内;Session用于页面间传递。
另外Application Session Cookie ViewState Cache Hidden
Session
1. Session用来保存每一个用户的专有信息
2. Session的生存期是用户持续请求时间加上一段时间(一般是20分钟左右)
3. Session信息是保存在Web服务器内存中的,保存数据量可大可小
4. Session超时或者被关闭将自动释放数据信息
5. 由于用户停止使用应用程序之后它仍在内存中存留一段时间,因此这种方法效率较低
6. 代码:Session[“UserID”]=“test”;
String UserName=Session[“UserID”].ToString();
ViewState
1. ViewState用来保存用户的状态信息,有效期等于页面的生命周期
2. 可以保存大量数据但是要慎用,因为会影响程序性能
3. 所有的Web服务器控件都是用ViewState在页面PostBack期间保存状态
4. 不需要则关闭 @page 里面设置EnableViewState=false
5. 代码:ViewState[“ID”]=“yiner”;
String ID =ViewState[“ID”].ToString();
Application
1. Application用来保存所有用户共用的信息
2. 在Asp时代,如果要保存的数据在应用程序生存期内不会或者很少发生改变,那么使用Application是理想的选择。但是在Asp.net开发环境中我们把类似的配置数据放在Web.config中。
3. 如果要使用Application 要注意的是所有的写操作都要在Application_OnStart事件中完成(global.Asax),尽管可以使用Application.Lock()避免了冲突,但是它串行化了对Application的请求,会产生严重的性能瓶颈。
4. 不要使用Application保存大数据量信息
5. 代码:Application[“UserID”]=”test”;
String UserName=Application[“UserID”].ToString();
Cookie
1. Cookie用来保存客户浏览器请求服务器页面的请求信息
2. 我们可以存放非敏感的用户信息,保存时间可以根据需要设置
3. 如果没有设置Cookie失效日期,它的生命周期保存到关闭浏览器为止
4. Cookie对象的Expires属性设置为MinValue表示永不过期
5. Cookie存储的数据量受限制,大多数的浏览器为4K因此不要存放大数据
6. 由于并非所有的浏览器都支持Cookie,数据将以明文的形式保存在客户端
7. 代码:Response.Cookies[“UserID”]=”test”;
String UserName= Resopnse.Cookies [“UserID”].ToString();
Cache
1. Cache用于在Http请求期间保存页面或者数据
2. Cache的使用可以大大的提高整个应用程序的效率
3. 它允许将频繁访问的服务器资源存储在内存中,当用户发出相同的请求后
服务器不是再次处理而是将Cache中保存的数据直接返回给用户
4. 可以看出Cache节省的是时间—服务器处理时间
5. Cache实例是每一个应用程序专有的,其生命周期==该应用程序周期
应用程序重启将重新创建其实例
6. 注意:如果要使用缓存的清理、到期管理、依赖项等功能必须使用Insert 或者Add方法方法添加信息
7. 代码:Cache[“ID”]=“yiner”;或者Cache.Insert(“ID”,”test”);
String ID =Cache[“ID”].ToString();
Hidden
1. Hidden控件属于Html类型的服务器控件,始终处于隐藏状态
2. 每一次提交的时候它会和其他服务器控件一起提交到服务器端
3. 代码如下:Hidden.Value=”king”;
string id=Hidden.Value; 要使用Runat=server
3. SQLAlchemy 中的 Session、sessionmaker、scoped_session
目录
Session 其实 就是一个会话, 可以和数据库打交道的一个会话
在一般的意义上, 会话建立与数据库的所有对话,并为你在其生命周期中加载或关联的所有对象表示一个“等待区”。他提供了一个入口点获得查询对象, 向数据库发送查询,使用会话对象的当前数据库连接, 将结果行填充在对象中, 然后存储在会话中, 在这种结构中称为身份映射 – 这种数据结构维护了每一个副本的唯一, 这种唯一意味着一个对象只能有一个特殊的唯一主键。
会话以基本无状态的形式开始,一旦发出查询或其他对象被持久化,它就会从一个引擎申请连接资源,该引擎要么与会话本身相关联,要么与正在操作的映射对象相关联。此连接标识正在进行的事务, 在会话提交或回滚其挂起状态之前,该事务一直有效。
会话中维护的所有变化的对象都会被跟踪 - 在再次查询数据库或提交当前事务之前, 它将刷新对数据库的所有更改, 这被称为工作模式单元。
在使用会话时候,最重要的是要注意与它相关联的对象是会话所持有的事务的代理对象 - 为了保持同步,有各种各样的事件会导致对象重新访问数据库。可能从会话中分离对象并继续使用他们,尽管这种做法有其局限性。但是通常来说,当你希望再次使用分离的对象时候,你会将他们与另一个会话重新关联起来, 以便他们能够恢复表示数据库状态的正常任务。
可能会将这里的session与http中的session搞混,需要注意的是,它有点用作缓存,因为它实现了 身份映射 模式,并存储了键入其主键的对象。但是,它不执行任何类型的查询缓存。 此外,默认情况下,Session使用弱引用存储对象实例。这也违背了将Session用作缓存的目的。关于session强应用下次再讨论。
1. session创建和管理数据库连接的会话 2. model object 通过session对象访问数据库,并把访问到的数据以 Identity Map 的方式,映射到Model object 中
1. session在刚被创建的时候,还没有和任何model object 绑定,可认为是无状态的 2. session 接受到query查询语句, 执行的结果或保持或者关联到session中 3. 任意数量的model object被创建,并绑定到session中,session会管理这些对象 4. 一旦session 里面的objects 有变化,那可是要commit/rollback提交或者放弃changs
一般来说,session在需要访问数据库的时候创建,在session访问数据库的时候,准确来说,应该是“add/ update / delete ”数据库的时候,会开启 database transaction 。 假设没有修改autocommit的默认值( False ), 那么, database transaction 一直会保持,只有等到 session 发生rolled back、committed、或者closed的时候才结束,一般建议,当 database transaction 结束的时候,同时 close session ,以保证,每次发起请求,都会创建一个新的 session 特别是对web应用来说,发起一个请求,若请求使用到 Session 访问数据库,则创建 session ,处理完这个请求后,关闭 session
Session 是一个直接实例化的常规的python 类。然而, 为了标准会会话的配置和获取方式, sessionmaker 类通常用于创建顶级会话配置, 然后可以在整个应用程序中使用它, 就不需要重复配置参数。
下面是sessionmaker 的使用方式
在上面,该 sessionmaker()创建了一个工厂类,在创建这个工厂类时我们配置了参数绑定了引擎。将其赋值给Session。每次实例化Session都会创建一个绑定了引擎的Session。 这样这个session在访问数据库时都会通过这个绑定好的引擎来获取连接资源当你编写应用程序时, 请将sessionmaker 工厂放在全局级别,视作应用程序配置的一部分。例如:应用程序包中有三个.py文件,您可以将该sessionmaker行放在__init__.py文件中; 在其他模块“from mypackage import Session”。这样,所有的Session()的配置都由该配置中心控制。
直接只用 create_engine 时,就会创建一个带连接池的引擎:
创建一个session,连接池会分配一个connection。当session在使用后显示地调用 session.close(),也不能把这个连接关闭,而是由由QueuePool连接池管理并复用连接。
确保 session 在使用完成后用 session.close、session.commit 或 session.rollback 把连接还回 pool,这是一个必须在意的习惯。
关于SQLAlchemy 数据库连接池:
session 和 connection 不是相同的东西, session 使用连接来操作数据库,一旦任务完成 session 会将数据库 connection 交还给 pool。 在使用 create_engine 创建引擎时,如果默认不指定连接池设置的话,一般情况下,SQLAlchemy 会使用一个 QueuePool 绑定在新创建的引擎上。并附上合适的连接池参数
create_engine() 函数和连接池相关的参数有:
SQLAlchemy不使用连接池:在创建引擎时指定参数 poolclass=NullPool 即禁用了SQLAlchemy提供的数据库连接池。SQLAlchemy 就会在执行 session.close() 后立刻断开数据库连接。当然,如果没有被调用 session.close(),则数据库连接不会被断开,直到程序终止。
关于 SQLAlchemy 的 engine ,这里有一篇文章写的很好: http://sunnyingit.github.io/book/section_python/SQLalchemy-engine.html
session不是线程安全的,在多线程的环境中,默认情况下,多个线程将会共享同一个session。试想一下,假设A线程正在使用session处理数据库,B线程已经执行完成,把session给close了,那么此时A在使用session就会报错,怎么避免这个问题?
1 . 可以考虑在这些线程之间共享Session及其对象。但是应用程序需要确保实现正确的锁定方案,以便多个线程不会同时访问Session或其状态。SQLAlchemy 中的 scoped_session 就可以证线程安全,下面会有讨论。 2 . 为每个并发线程维护一个会话,而不是将对象从一个Session复制到另一个Session,通常使用Session.merge()方法将对象的状态复制到一个不同Session的新的本地对象中。
上面简单介绍了sessionmaker的作用,下面开始探讨 scoped_session 对创建 Session 的影响。现在先探讨单线程情况。
结论:
通过 sessionmaker 工厂创建了两个 Session ,而且可以看到 s1 s2 是两个不同的 Session 。 在 s1 添加 person 后,继续使用 s2 添加 person 报错. 说 person 这个对象 已经和 另一个 Session 关联一起来了, 所以再次关联另一个 Session 就会报错。
即在上面代码的 s1.add(person) 之后, s1.commit() ,然后再 s2.add(persion)这里就没帖代码了。
结论:
即使在 s1 提交之后, s2 再去添加 person 也会发生错误,但 s1 的提交是成功了的,数据 person 已经存放在数据库了。 当 s1 添加 person 并提交,然后关闭 s1 , s2 再去添加并提交 person 数据库,这不会报错,但是数据库也不会出现两条 person 数据。
结论:
s1 关闭之后, s2 再去添加提交同一个对象,不会报错,但是数据库值有一条 person 数据。
结论:
当然, s1 , s2 添加提交不同的对象,不会出错。在数据库成功新增数据。
以上说明:
一个对象一旦被一个 Session 添加,除非关闭这个 Session ,不然其他的 Session 无法添加这个对象。 一个 Session 添加并提交一个对象,然后关闭该 Session ,其他的 Session 可以添加并提交这个对象,但是数据库并不会有这条数据。
结论:
可以看到,通过 scoped_session再去创建 Session ,返回的是同一个 Session 。 scoped_session类似单例模式,当我们调用使用的时候,会先在Registry里找找之前是否已经创建Session,未创建则创建 Session ,已创建则直接返回。
这里探讨在多线程下使用 scoped_session 与不使用 scoped_session 的情况
当不使用 scoped_session 时,也分两种情况,是否创建全局性 Session
结论:
每个线程下的 Session 都是不同的 Session 数据库成功新增了线程3提交的数据,其他的线程中的数据并没有提交到数据库中去。
结论:
全部线程下的 Session 都时同一个 Session 每个线程下的数据都被提交到了数据库
结论:
每个线程下的 Session 都不相同 只有线程3下的数据被提交到了数据库
结论:
每个线程下的 Session 是同一个 Session 每个线程下的数据都没提交到了数据库
以上说明:
在同一个线程中,有 scoped_session 的时候,返回的是同一个 Session 对象。 在多线程下,即使通过 scoped_session 创建Session,每个线程下的 Session 都是不一样的,每个线程都有一个属于自己的 Session 对象,这个对象只在本线程下共享。 scoped_session 只有在单线程下才能发挥其作用。在多线程下显得没有什么作用。
4. session是什么啊
session在计算机中,尤其是在网络应用中,称为“会话控制”。
Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。
Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。
(4)数据库中session扩展阅读
Session的相关设置:
1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;
2、session. name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“phpSESSID”;
3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!
4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!
5. 如何查看oracle数据库中哪些session异常阻塞了系统
Oracle数据库运维过程中有时会遇到一种异常情况,由于错误的操作或代码BUG造成session异常地持有锁不释放,并大量阻塞系统对话。这时候需要找出造成异常阻塞的session并清除。 oracle session通常具有三个特征: (1)一个session可能阻塞多个session; (2)一个session最多被一个session阻塞; (3)session阻塞关系不会形成环路。(环路即死锁,oracle能自动解除) 因此session的阻塞关系为一棵树,进而DB系统所有session的BLOCK阻塞关系是一个由若干session阻塞关系树构成的森林,而异常session一定会在故障爆发时成为根(root)。因此,找寻异常锁表session的过程就是找出异常的root。 一般认为异常root有两个特征:(1)block树的规模过大,阻塞树规模即被root层层阻塞的session总数;(2)阻塞的平均等待时间过长。 查找异常session的方法一: OEM—> performance—> Blocking Sessions 查找异常session的方法二: select r.root_sid, s.serial#, r.blocked_num, r.avg_wait_seconds, s.username,s.status,s.event,s.MACHINE, s.PROGRAM,s.sql_id,s.prev_sql_id from (select root_sid, avg(seconds_in_wait) as avg_wait_seconds, count(*) - 1 as blocked_num from (select CONNECT_BY_ROOT sid as root_sid, seconds_in_wait from v$session start with blocking_session is null connect by prior sid = blocking_session) group by root_sid having count(*) > 1) r, v$session s where r.root_sid = s.sid order by r.blocked_num desc, r.avg_wait_seconds desc; 该SQL语句即是根据v$session的字段blocking_session统计阻塞树根阻塞session的计数以及平均阻塞时间、并进行排序,排名最前的往往是异常session。 另外需要注意的是,持有锁时间最长、或等待时间最长的session都不一定是造成阻塞的根源session!
6. Hibernate中Session什么意思
Hibernate中Session 是Hibernate中的缓存对象 用此session操作数据库后会缓存返回的结果在session里面 当你再次操作数据库的时候 如果session缓存里面有相应的值 则不用去与数据库交互直接返回结果
servlet 中的Session 也是缓存 其缓存你与服务器对话时候的一些信息
总之所有的session基本都是起缓存作用的 就是把一些信息缓存在内存中 方便存取值
但是不同的session是不能相互直接赋值的 因为是两个不同的概念 只是名字一样
名字一样也是为了帮助程序员理解 学了servlet的session 后再遇到session也就应该是缓存作用的
不知道我的回答你满意不
7. 数据库session有什么作用
session 不是数据库关键字 是脚本语言中的关键字 比如ASP中 Session 允许通过将对象存储在 Web服务器的内存中在整个用户会话过程中保持任何对象。比如你在一个网页中输入了用户名和密码,而你需要到另外一个网页指定该用户ID,就用SESSION来完成
8. Oracle的session和process的区别与分析
session 和 process的区别:
连接connects,会话sessions和进程pocesses的关系
每个sql login称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,
一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。
session 和 process的关系,tom在他的书里写的很清楚了
一个process可以有0个,1个或者多个session
一个session也可以存在这个或者那个process中
oracle中session跟process的研究
使用方法:
首先看看v$session跟v$processwww.hbbz08.com 中主要的字段属性:
v$session(sid,serial#,paddr,username,status,machine,terminal,sql_hash_value,sql_address,,,)
v$process(addr,spid,,,)
可看到v$session中的paddr跟v$process中的addr对应,也即会话session在数据库主机上对应进程的进程地址.
这里我们要先定位该session正在执行的sql语句,此时我们可以查询如下的语句: select sql_text
from v$sqltext_with_newlines
where (hash_value,address) in (select sql_hash_value,sql_address from v$session where sid=&sid) order by address,piece
9. php session存到数据库 怎么进行session验证
首先生成一个随机的字符串包括
字母
数字
或汉字
然后用php中生成图片的函数把这个字符串生成图片并在页面展示出来
然后session存储这个字符串,没必要存到数据库中,因为就用那么一次
然后用户在前台输入后
与session进行比较验证
10. 数据库取得session无法序列化
数据库取得session无法序列化是状态服务器使用二进制序列化导致的。根据查询相关公开信息显示,SerializationException提到无法序列化的类中包括session,状态服务器使用二进制序列化而不是XML序列化。