整个MVC会话中的一个Oracle连接

时间:2018-05-22 03:31:28

标签: sql asp.net-mvc oracle11g session-variables session-state

我需要为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'未标记为可序列化。]

这是以正确的方式还是以其他方式达到我的要求?

1 个答案:

答案 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