aspnet中,session默认以inproc模式存储,也就是保存在iis进程中,这样有个优点就是效率高,但不利于为本负载均衡扩展。可以把session信息保存在SQL Server中,据说,该种方式比起inproc性能损失为10%-20%。如何实现呢,主要分两步介绍:
1、初始化SQL Server中的状态数据库
ASPNET SQL Server 提供注册工具Aspnet_regsqlexe,用于创建供 ASPNET 中的 SQL Server 提供程序使用的 Microsoft SQL Server 数据库。Aspnet_regsqlexe位于 /%windir%/MicrosoftNET/Framework/<versionNumber>/aspnet_regsqlexe 目录下。如果麻烦,可以 直接用visual studio tools 的命令提示工具中直接输入aspnet_regsqlexe使用。用法如下:
Aspnet_regsqlexe <options>
可以用如下的语法来添加默认session数据库ASPState
aspnet_regsqlexe -S localhost -U sa -P why1234 -ssadd -sstype p
-S,-U/-P
必须是大写,分别表示数据库服务器,用户名和密码。
-ssadd / –ssremove 参数:
-ssadd表示是添加Session数据库, -ssremove表示移除Session数据库
创建自定义数据库myAppState,可以用如下的语法:
aspnet_regsqlexe -S localhost -U sa -P why1234 -ssadd -sstype c -d myAppState
2、配置webconfig
在webconfig的 <systemweb>节下添加如下配置:
<sessionState mode="SQLServer" sqlConnectionString="server=localhost; uid=sa; pwd=123456;"/>
如果在初始化数据库的时候,创建了自定义数据库可以用类似于如下的的配置:
<sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="server=localhost; DataBase=myAspState;uid=sa; pwd=123456;"/>
通过以上两步的设置,已经可以了。详细情况请参阅msdn。
没看明白,
set rs=servercreateobject("adodbrecordset")
rsopen "selete from 表 where 条件",conn,1,1
if not(rseof and rsbof) then
session("dengji")=rs("dengji")
end if
responsewrite(session("dengji"))
不知道是不是这么个意思
官网有写,不过看的不是很懂。
大致意思是Session用于创建程序与数据库之间的会话,并将这个会话以python的面向对象方式(“holding zone”)进行包装,提供给python其他程序调用。
Session提供一个进行数据库查询(query)的入口,python程序通过Session实例,可以对正在连接的数据库进行查询(查询结果是一个面向对象实例),将修改的内容(一般是修改面向对象实例,然后通过Session将修改的实例与数据库中特定数据“同步”。)
Session中有一个很重要的理念“Identity Map”。Session查询的结果实例,我们修改过的实例,和数据库中的数据是怎么关联起来的呢?就是靠“Identity Map”,每个实例都具有“Identity Map”记录,每个“Identity Map”都和数据行的主键(primary key)一一对应。
(这是我的渣英语翻译+个人理解写的。有不对的地方,欢迎大神指点)
官网内容:
In the most general sense, the Session establishes all conversations with the database and represents a “holding zone” for all the objects which you’ve loaded or associated with it during its lifespan It provides the entrypoint to acquire a Query object, which sends queries to the database using the Session object’s current database connection, populating result rows into objects that are then stored in the Session, inside a structure called the Identity Map - a data structure that maintains unique copies of each object, where “unique” means “only one object with a particular primary key”
官网资料:>
1 audit
用审记来记录用户的 *** 作信息
2 trigger
用系统触发器来记录用户登录
3 logmnr
从log文件中挖出用户登录信息
推荐使用第3种,不占用系统资源,而且很方便。
===============================
Oracle 中记录用户登录信息
我们可以使用 Oracle Audit 函数来记录用户登录信息,但是如果开放了 Audit 函数将会使Oracle 性能下降,甚至导致 Oracle 崩溃。那我们如何才能记录用户登录信息呢?其实我们可以通过建立触发器的方式来实现。方法如下:
1 用 sys 用户登录 Oracle
2 创建记录用户登录信息的表
CREATE TABLE LOG$INFORMATION
(
ID NUMBER(10),
USERNAME VARCHAR2(30),
LOGINTIME DATE,
TERMINAL VARCHAR2(50),
IPADRESS VARCHAR2(20),
OSUSER VARCHAR2(30),
MACHINE VARCHAR2(64),
PROGRAM VARCHAR2(64),
SID NUMBER,
SERIAL# NUMBER,
AUSID NUMBER
)
/
3 创建一个 Sequence,作为登录信息的主键
CREATE SEQUENCE LOGIN_SEQ
minvalue 1
maxvalue 9999999999
start with 1
increment by 1
cache 20
/
4 创建触发器,记录用户登录信息
CREATE OR REPLACE TRIGGER LOGIN_RECORD_TR
AFTER logon ON DATABASE
DECLARE
mtSession v$session%ROWTYPE;
CURSOR cSession(iiQuerySid IN NUMBER) IS
SELECT FROM v$session
WHERE audsid = iiQuerySid;
BEGIN
OPEN cSession(userenv('SESSIONID'));
FETCH cSession INTO mtSession;
IF cSession%FOUND AND SYS_CONTEXT ('USERENV','IP_ADDRESS') IS NOT NULL THEN
INSERT INTO log$information(
id,
username,
logintime,
terminal,
ipadress,
osuser,
machine,
program,
sid,
serial#,
ausid
) VALUES(
login_seqnextval,
USER,
SYSDATE,
mtSessionTerminal,
SYS_CONTEXT ('USERENV','IP_ADDRESS'),
mtSessionOsuser,
mtSessionMachine,
mtSessionProgram,
mtSessionSid,
mtSessionSerial#,
userenv('SESSIONID')
);
END IF;
CLOSE cSession;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
/
5 将 SYSLOG$INFORMATION 授权给需要查看登录记录的用户
Grant select on SYSLOG$INFORMATION to XXX
/
=======================================
审计用户登录和登出
记录每个用户每次登录数据库和退出数据库的日期和事件。设置步骤如下:
1 设置系统审计相关的参数
2 重新启动数据库
3以SYSTEM帐号登录数据库执行下列语句,设置CONNECT审计并检查是否设置成功:
SQL> connect system/password
SQL> audit connect
SQL> col user_name format a11
SQL> col audit_option format a14
SQL> select user_name, audit_option, success, failure
from sysdba_stmt_audit_opts;
USER_NAME AUDIT_OPTION SUCCESS FAILURE
----------- -------------- ---------- ----------
CREATE SESSION BY ACCESS BY ACCESS
4查询 AUD$表就可以查看到审计结果了
SQL> col userid format a8
SQL> select sessionid, to_char(timestamp#,'DD-MON-YY:HH24:MI:SS') login,
userid, to_char(logoff$time,'DD-MON-YY:HH24:MI:SS') logoff
from sysaud$ where userid='SCOTT';
SESSIONID LOGIN USERID LOGOFF
---------- ------------------ -------- ------------------
132 22-FEB-00:13:55:06 SCOTT 22-FEB-00:14:04:05
注意:不同的版本的ORACLE数据库AUD$字典会有所不同,实际情况请参照你当前版本的数据库的AUD$表。
1411 审计SYS用户的 *** 作(ORACLE 9i Release 2)
在ORACLE 92之前,SYS帐户是系统中的一个唯一不受审计的帐户。在ORACLE 9I Release 2和以后的版本中,通过一些设置就可以对SYS帐号进行审计。
在ORACLE 92以后的版本中,可以通过设置AUDIT_SYS_OPERATIONS可以实现对具有SYS/SYSDBA/SYSOPER权限的用户的审计。
1412 使用WINDOWS 事件管理器来记录审计信息
和UNIX系统不同,WINDOWS的审计结果不是存储在 *** 作系统文件中,而是直接存储在WINDOWS 事件日志中。本节介绍如何配置数据库审计,并用事件管理器来查看审计记录。
在WINDOWS下设置数据库审计,需要按照如下的步骤:
1、配置审计
首先要确认WINDOWS的事件日志(EVENTLOG)服务是否启动。可以通过“控制面板/管理工具/服务”工具来查看。
然后通过修改ORACLE的参数(参数修改方法参见前面的关于ORACLE参数文件的描述)AUDIT_TRAIL:
AUDIT_TRAIL=0S
在WINDFOWS平台下要注意的是:
不管AUDIT_TRAIL设置为什么值,有部分ORACLE的 *** 作会记录在事件日志中
在WINDOWS下不支持AUDIT_FILE_DEST参数,如果设置了该参数,数据库会报错
LRM-00101: UNKNOWN PARAMETER NAME 'AUDIT_FILE_DEST'
ORA-01078: FAILURE IN PROCESSING SYSTEM PARAMETERS
在使用审计前,要确保事件日志有足够大的空间来存储审计信息
2、检查是否安装好AUDIT相关的对象
最简单的检查方法是看看AUD$是否存在。如果AUDIT相关对象安装不正确,可以通过%ORACLE_HOME%\rdbms\admin\catauditsql脚本来安装AUDIT相关对象。如果要删除审计,可以执行%ORACLE_HOME%\rdbms\admin\catnoaudsql。
3、配置审计
在配置审计之前,首先要说明的是,审计是一种会带来额外开销的 *** 作。因此在可能的情况下,尽量减少审计 *** 作。另外,如果打开审计 *** 作,那么对一些数据库事件的审计是缺省的,这些审计事件包括:
实例关闭
通过SYSOPER和SYSDBA连接数据库
在WINDOWS下配置审计的步骤和在UNIX下配置审计类似,这里就不再描述了。审计信息会自动写入WINDOWS的事件日志种,通过事件管理器可以查看日志。
以上就是关于java,如何把session保存到数据库里面全部的内容,包括:java,如何把session保存到数据库里面、如何根据Session显示数据库中的值、sqlalchemy 里的 session 具体有什么作用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)