我需要为MVC中的用户的整个会话创建单个连接。
下面的代码在Login控制器中写道,以实现相同的
OracleConnection con = new OracleConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["OracleConnection"].ConnectionString;
con.Open();
Session["oracle_con"] = con;
然后每当我需要连接时,将检查如下
OracleConnection or_con = (OracleConnection)Session["oracle_con"];
if (or_con.State == ConnectionState.Closed)
or_con.Open();
这在我的本地系统中工作正常,sessin sate模式是'InProc'
但是在服务器中,会话状态模式是“StateServer”,因此Oracle连接到会话的转换会产生以下错误
无法序列化会话状态。在'StateServer'和 'SQLServer'模式,ASP.NET将序列化会话状态对象, 因此,不可序列化的对象或MarshalByRef对象是 不允许。如果类似的序列化,则适用相同的限制 由“自定义”模式下的自定义会话状态存储完成。
[SerializationException:Type 汇编中的“Oracle.ManagedDataAccess.Client.OracleConnection” 'Oracle.ManagedDataAccess,Version = 4.121.1.0,Culture = neutral, PublicKeyToken = 89b483f429c47342'未标记为可序列化。]
这是以正确的方式还是以其他方式达到我的要求?
答案 0 :(得分:0)
OracleConnection不实现Serializable,因此无法满足您的要求。为什么要将连接放在会话中? ODP.NET默认使用连接池,因此不必从头创建新的连接请求。
如果连接创建速度很慢,可能是因为缺少必须创建的日志文件夹,C:\ oracle_client \ log \ diag \ clients。
请参见此处Creating 32-bit ODP.Net OracleConnection object is very slow,此处http://milagaia.blogspot.com/2012/04/odpnet-slow-first-connection.html?m=1。