- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的应用程序中使用了一种“每次 session session ”模式实现。在这种方法中,“NHibernate session ”保留在“HTTP session ”中。在每个“Http Request”中,“NHibernate Session”在请求开始时重新连接并在请求结束时断开连接。 “NHibernate Session”在“ session ”结束时保存在“HTTP Session”中。这工作得很好。
问题:
现在我正在考虑使用 "StateServer mode"在“Http session ”上。因此,“HTTP Session”中的所有对象都必须是可序列化的,包括“NHibernate Session”。
所以我正在进行概念验证,以验证“NHibernate Session”及其缓存对象的序列化/反序列化是否有效。
“概念验证”是以下单元测试。目标是让它通过。
代码:
/*069*/ [Test]
/*070*/ public void Test()
/*071*/ {
/*072*/ //for inspecting the SQL commands
/*073*/ NhSqlLogCapture hhSqlLogCapture = new NhSqlLogCapture();
/*074*/
/*075*/ MemoryStream ms = new MemoryStream();
/*076*/
/*077*/ ISession sessionBefore = null;
/*078*/ ISession sessionAfter = null;
/*079*/
/*080*/ //querying before the serialization.
/*081*/ try
/*082*/ {
/*083*/ sessionBefore = this.sessionFactory.OpenSession();
/*084*/ sessionBefore.FlushMode = FlushMode.Auto;
/*085*/
/*086*/ hhSqlLogCapture.Enable();
/*087*/
/*088*/ //Querying only 'DetailEtt'
/*089*/ hhSqlLogCapture.SqlStatments.Clear();
/*090*/ ICriteria crt = sessionBefore.CreateCriteria<DetailEtt>();
/*091*/ crt
/*092*/ .SetFetchMode("Master", FetchMode.Select);
/*093*/ IList<DetailEtt> cen1DetailList = crt.List<DetailEtt>();
/*094*/
/*095*/ //BEGIN: Serializing
/*096*/ //also serializing an instance of 'DetailEtt' to verify that keeps only one instance to the same database record.
/*097*/ sessionBefore.Disconnect();
/*098*/ Object[] serializationArray = new object[] { sessionBefore, sessionBefore.Get<DetailEtt>(1) };
/*099*/ BinaryFormatter bf = new BinaryFormatter();
/*100*/ bf.Serialize(ms, serializationArray);
/*101*/ //END: Serializing
/*102*/
/*103*/ //assertions
/*104*/ //Checking the sql command executed.
/*105*/ Assert.AreEqual(1, hhSqlLogCapture.SqlStatments.Count, "hhSqlLogCapture.SqlStatments.Count");
/*106*/ Regex rx = new Regex("(?is).*SELECT.*FROM.*DETAIL.*");
/*107*/ Assert.IsTrue(rx.IsMatch(hhSqlLogCapture.SqlStatments[0]), hhSqlLogCapture.SqlStatments[0]);
/*108*/
/*109*/ hhSqlLogCapture.Disable();
/*110*/ }
/*111*/ finally
/*112*/ {
/*113*/ sessionBefore = null;
/*114*/ }
/*115*/
/*116*/ try
/*117*/ {
/*118*/ //BEGIN: Deserializing
/*119*/ BinaryFormatter bf = new BinaryFormatter();
/*120*/ ms.Seek(0, SeekOrigin.Begin);
/*121*/ Object[] deserializationArray = (Object[])bf.Deserialize(ms);
/*122*/ DetailEtt dtEttDeserialized = (DetailEtt)deserializationArray[1];
/*123*/ sessionAfter = (ISession)deserializationArray[0];
/*124*/ //BEGIN: Deserializing
/*125*/
/*126*/ IDbConnection conn = this.dbProvider.CreateConnection();
/*127*/ conn.Open();
/*128*/ sessionAfter.Reconnect(conn);
/*129*/
/*130*/ //Enabling again because the session loses the reference to the log (I think).
/*131*/ hhSqlLogCapture.Enable();
/*132*/ hhSqlLogCapture.SqlStatments.Clear();
/*133*/
/*134*/ DetailEtt dtEtdSSGet = sessionAfter.Get<DetailEtt>(1);
/*135*/ MasterEtt mtEtd = dtEtdSSGet.Master;
/*136*/ Console.WriteLine(mtEtd.Description);
/*137*/
/*138*/ //assertions
/*139*/ //Checking the sql command executed.
/*140*/ Assert.AreEqual(1, hhSqlLogCapture.SqlStatments.Count, "hhSqlLogCapture.SqlStatments.Count");
/*141*/ Regex rx = new Regex("(?is).*SELECT.*FROM.*MASTER.*");
/*142*/ Assert.IsTrue(rx.IsMatch(hhSqlLogCapture.SqlStatments[0]), hhSqlLogCapture.SqlStatments[0]);
/*143*/ //verify that keeps only one instance to the same database record
/*144*/ Assert.AreSame(dtEttDeserialized, dtEtdSSGet, "verify that keeps only one instance to the same database record");
/*145*/ }
/*146*/ finally
/*147*/ {
/*148*/ sessionAfter.Close();
/*149*/ }
/*150*/ }
测试几乎通过了所有内容。但是当尝试加载一个“懒惰”的实体时它会失败。
错误:
SofPOC.Questions.SerializeSession.SerializeSessionTest.Test:
NHibernate.LazyInitializationException : Initializing[SofPOC.Questions.SerializeSession.Entities.MasterEtt#5]-Could not initialize proxy - no Session. em NHibernate.Proxy.AbstractLazyInitializer.Initialize()
at NHibernate.Proxy.AbstractLazyInitializer.Initialize()
at Spring.Data.NHibernate.Bytecode.LazyInitializer.Invoke(IMethodInvocation invocation) in c:\_prj\spring-net\trunk\src\Spring\Spring.Data.NHibernate21\Data\NHibernate\Bytecode\LazyInitializer.cs:line 101
at Spring.Aop.Framework.AbstractMethodInvocation.Proceed() in c:\_prj\spring-net\trunk\src\Spring\Spring.Aop\Aop\Framework\AbstractMethodInvocation.cs:line 284
at Spring.Aop.Framework.DynamicProxy.AdvisedProxy.Invoke(Object proxy, Object target, Type targetType, MethodInfo targetMethod, MethodInfo proxyMethod, Object[] args, IList interceptors) in c:\_prj\spring-net\trunk\src\Spring\Spring.Aop\Aop\Framework\DynamicProxy\AdvisedProxy.cs:line 208
at DecoratorAopProxy_9872659265c04d36bc9738f2aaddfb08.get_Description()
at SofPOC.Questions.SerializeSession.SerializeSessionTest.Test() in C:\Users\hailtondecastro\lixo\stackoverflow\dotnet\StackoverflowNetPOCs_20120718\src\SofPOC.Net4.NH2.Spring13.2010\Questions\SerializeSession\SerializeSessionTest.cs:line 136
详细信息:
[Serializable]
public class DetailEtt
{
private Int32? id;
/// <summary>
/// PK
/// </summary>
public virtual Int32? Id
{
get { return id; }
set { id = value; }
}
private String description;
/// <summary>
/// TODO:
/// </summary>
public virtual String Description
{
get { return description; }
set { description = value; }
}
private MasterEtt master;
/// <summary>
/// TODO:
/// </summary>
public virtual MasterEtt Master
{
get { return master; }
set { master = value; }
}
}
MasterEtt:
[Serializable]
public class MasterEtt
{
private Int32? id;
/// <summary>
/// PK
/// </summary>
public virtual Int32? Id
{
get { return id; }
set { id = value; }
}
private String description;
/// <summary>
/// TODO:
/// </summary>
public virtual String Description
{
get { return description; }
set { description = value; }
}
}
DetailEtt.hbm.xml:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="SofPOC.Questions.SerializeSession.Entities" assembly="SofPOC.Net4.NH2.Spring13">
<class name="DetailEtt" table="DETAIL">
<id name="Id" type="Int32">
<column name="ID" sql-type="INTEGER"></column>
<generator class="assigned"></generator>
</id>
<property name="Description" type="String">
<column name="DESCRIPTION" sql-type="VARCHAR( 100 )"></column>
</property>
<many-to-one name="Master" fetch="select">
<column name="MS_ID" sql-type="INTEGER"></column>
</many-to-one>
</class>
</hibernate-mapping>
MasterEtt.hbm.xml:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="SofPOC.Questions.SerializeSession.Entities" assembly="SofPOC.Net4.NH2.Spring13">
<class name="MasterEtt" table="MASTER">
<id name="Id" type="Int32">
<column name="ID" sql-type="INTEGER"></column>
<generator class="assigned"></generator>
</id>
<property name="Description" type="String">
<column name="DESCRIPTION" sql-type="VARCHAR( 100 )"></column>
</property>
</class>
</hibernate-mapping>
问题:
即使在重新连接反序列化的“Hibernate Session”后,我也会收到“Lazy Load Error”。如何在不必重新附加实体的情况下避免这种“延迟加载错误”?
我正在使用:
完整的来源在这里:Q11553780.7z
注意事项:
已编辑:
我发现问题的原因出在NHibernate的NHibernate.Proxy.AbstractLazyInitializer
类中。字段 _session
标记为 [NonSerialized]
。这使得该字段不被序列化。因此它在反序列化后为 null。
查看代码:
namespace NHibernate.Proxy
{
[Serializable]
public abstract class AbstractLazyInitializer : ILazyInitializer
{
/// <summary>
/// If this is returned by Invoke then the subclass needs to Invoke the
/// method call against the object that is being proxied.
/// </summary>
protected static readonly object InvokeImplementation = new object();
private object _target = null;
private bool initialized;
private object _id;
[NonSerialized]
private ISessionImplementor _session;
...
编辑 2:
问题的原因实际上是 [NonSerialized] 属性,因为当我进行以下“hack”时,测试通过了。通过反射(reflection),我将“_session”的属性从“Private | NotSerialized”更改为仅“Private”。
黑客:
protected override void OnSetUp()
{
//Hacking "_session"
Type aliType = Type.GetType("NHibernate.Proxy.AbstractLazyInitializer, NHibernate");
FieldInfo fiSession = aliType.GetField("_session", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
FieldInfo fi_m_fieldAttributes =
fiSession.GetType().GetField(
"m_fieldAttributes",
System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance);
// changing it from "Private | NotSerialized" to only "Private"
fi_m_fieldAttributes.SetValue(fiSession, FieldAttributes.Private);
base.OnSetUp();
}
最佳答案
据我所知,可以尝试三种选择:
如果您尝试 nr 1,请告诉我们它是否有效。我很想看看会发生什么。理论上它应该有效。
关于c# - 序列化/反序列化 "NHibernate Session",延迟初始化错误 ("StateServer mode"集群),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553780/
我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这
当我尝试打印 BST 的级别顺序时,这个问题提示了我。 这是一个 Pre-Order Sequence: 4, 1, 2, 3, 5, 6, 7, 8 In_order Sequence : 1, 2
我的代码在 main(序列测试;)的第一行出现错误,指出它是对 sequence::sequence() 的 undefined reference 。我无法更改 main 中的代码。有谁知道我该如何
这可能很简单,但我在通常的 latex 指南中找不到任何相关内容。在这句话中: {\em hello\/} “\/”的目的是什么? 最佳答案 这就是所谓的斜体校正。其目的是确保斜体文本后有适当的间距。
当我从 Postgresql 表中删除所有记录,然后尝试重置序列以在插入时开始一个编号为 1 的新记录时,我得到不同的结果: SELECT setval('tblname_id_seq', (SELE
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。 它不允许在多个查询中
如何在 Groovy 中获取给定数字的序列,例如: def number = 169 // need a method in groovy to find the consecutive number
基本上,如果这是 .NET,它看起来像这样: ISomething { string A { get; } int B { get; } } var somethings = new List
说以下代码部分(同一块): A <= 1 A <= 2 变量 A 总是被赋值为 2 吗?还是会出现竞争条件并分配 1 或 2? 我对非阻塞赋值的理解是,由硬件在 future 分配变量 A,因此它可能
在运行 WiX 设置时,我正在寻找操作列表及其顺序。不知何故,官方网站似乎没有提供任何信息。 基本问题是我想正确安排我的自定义操作。通常我需要使用 regsvr32.exe 注册一个 DLL,而这只能
F#初学者在这里 我想创建一个类型,它是具有至少一个元素的另一种具体类型(事件)的序列。任何其他元素都可以在以后随时添加。通常在 C# 中,我会创建一个具有私有(private) List 和公共(p
作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。 我的脚本创建了一个过程来删除表/序列,执行该过程,然
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
这个问题已经有答案了: sql ORDER BY multiple values in specific order? (12 个回答) 已关闭 9 年前。 我有一个 sql 语句,我想要ORDER
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
在用java编写代码时,我需要用“],[”分割字符串。下面是我的代码。 try (BufferedReader reader = new BufferedReader(new InputStreamR
这个问题已经有答案了: Project Euler Question 14 (Collatz Problem) (8 个回答) 已关闭 9 年前。 我正在尝试查找数字的 Collatz 序列。以下
我有一个例程函数process_letter_location(const char& c, string &word)。 在我的 main 中,我声明了一系列字符串变量,如下所示: string s
我需要找到最长的多米诺骨牌链,给定一组 12 个随机挑选的多米诺骨牌。我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性)。多米诺骨牌由一 block “砖 blo
我有这个数据结构 Seq,它继承了类 vector 但有一些额外的功能。使用这个数据结构 Seq 我有这个预定义的数据结构: typedef Seq > MxInt2d; 我现在想要一个包含多个 Mx
我是一名优秀的程序员,十分优秀!