有很多时候我们需要多线程并发访问数据库,这样就存在访问冲突的问题,传统中的SQL可以用"for update"一类的语法实现数据锁定,在NHiberante里也有类似的实现方法,很简单,下面是一个例子方法,实现在事务里保证数据访问的独立性:
        private IList<MailInfo> Load(int first, int count)
        {
            IList<MailInfo> list = new List<MailInfo>();
            if (count == 0return list;

            ISession session = DAORepository.Instrance.DbSession;
            using (ITransaction tx = session.BeginTransaction())
            {
                try
                {
                    ICriteria cri = session.CreateCriteria(typeof(MailInfo));
                    cri.SetFirstResult(first);
                    cri.SetMaxResults(count);
                    cri.Add(new Expression.EqExpression("Status", (int)MailStatusType.New));
                    cri.AddOrder(Expression.Order.Desc("CreateTime"));
                    cri.SetLockMode(LockMode.UpgradeNoWait);
                    list = cri.List<MailInfo>();
                    foreach (MailInfo mi in list)
                    {
                        mi.Status = (int)MailStatusType.Lock;
                        session.Update(mi);
                    }
                    tx.Commit();
                }
                catch (Exception ex)
                {
                    tx.Rollback();
                    string err = ex.Message;
                }
                finally
                {
                    session.Close();
                }
            }
            return list;
        }
该方法实现了"select top "+count+" * from MailInfo where Status="+(int)MailStatusType.New+" Order by CreateTime"查询功能,代码里实现锁定的就是这一句:
cri.SetLockMode(LockMode.UpgradeNoWait);
用于条件查询时,还有其他的锁定如session.Lock()等。
posted @ 2012-02-07 10:38 Byrd 阅读(10) 评论(0) 编辑
hibernate.cfg.xml 中hibernate.hbm2ddl.auto配置节点如下:


<property name="hbm2ddl.auto">create-drop</property>
  • update : auto execute SchemaUpdate on BuildSessionFactory
  • create : auto execute SchemaExport on BuildSessionFactory
  • create-drop : auto execute SchemaExport on BuildSessionFactory recreating the schema
  • validate : auto execute SchemaValidator on BuildSessionFactory

hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none"

 

update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。 

 

 

create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就导致了数据库表数据丢失。

create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

 

<property name="hbm2ddl.keywords">auto-quote</property>
  • none : disable any operation regarding RDBMS KeyWords
  • keywords : (activated by Default)imports all RDBMS KeyWords where the NH-Dialect can provide the implementation of IDataBaseSchema (so far available for MsSQL, Oracle, Firebird, MsSqlCe, MySQL, SQLite, SybaseAnywhere)
  • auto-quote : imports all RDBMS KeyWords and auto-quote all table-names/column-names on BuildSessionFactory

备注:

当我们把hbm2ddl.auto=create时hibernate先用hbm2ddl来生成数据库schema。
当我们把hibernate.cfg.xml文件中hbm2ddl属性注释掉,这样我们就取消了在启动时用hbm2ddl来生成数据库schema。通常只有在不断重复进行单元测试的时候才需要打开它,但再次运行hbm2ddl会把你保存的一切都删除掉(drop)---- create配置的含义是:“在创建SessionFactory的时候,从scema中drop掉所以的表,再重新创建它们”。
注意,很多Hibernate新手在这一步会失败,我们不时看到关于Table not found错误信息的提问。但是,只要你根据上面描述的步骤来执行,就不会有这个问题,因为hbm2ddl会在第一次运行的时候创建数据库schema, 后续的应用程序重启后还能继续使用这个schema。假若你修改了映射,或者修改了数据库schema,你必须把hbm2ddl重新打开一次。

一般情况下不建议使用hibernate.hbm2ddl.auto的创建或修改方式,可以把hibernate.hbm2ddl.auto的value置为none,或者置为validate比较好,只验证表结构是否正确。而数据表结构手动来生成。

 

 

 

posted @ 2012-01-09 15:54 Byrd 阅读(10) 评论(0) 编辑
问题:

VS写类方法属性注释时,在同一个工程中注释可见,跨工程不可见。格式是标准的XML注释:
/// <summary>
/// 摘要
/// </summary>
/// <param name="param">参数</param>
/// <returns>返回值</returns>

 

 解决方法:

在项目属性中的“生成”选项卡勾选“XML文档文件”选项,这样编译时就会在相应目录下生 成XML格式文件,里面是该程序集所有类中的XML格式注释。

posted @ 2011-12-28 16:41 Byrd 阅读(6) 评论(0) 编辑

这个错误的原因是因为直接在源代码里面将服务器控件删除,对应的控件代码在 designer的文件里面还存在,导致两个文件的内容匹配不了引起的报错,解决也简单,直接在aspx文件里面用设计视图拖动一下控件,或者新增一个服务器控件,然后保存就可以解决。。

 

posted @ 2011-12-13 11:07 Byrd 阅读(9) 评论(0) 编辑

事务处理用到TransactionScope,调试提示错误“事务已被隐式或显式提交,或已终止”。

看了一篇文章"ConnectString中enlist设置的含义",后来给连接字符串加了"Enlist=false"。问题就这样解决了。

ConnectionString = "Data Source=192.168.1.1;Initial Catalog=cargoplus;Enlist=false;Persist Security Info=True;User ID=sa;Password=sa"

注释:

 

SqlConnection.ConnectionString 属性支持关键字 Enlist,该关键字指示 System.Data.SqlClient 是否将检测事务上下文并自动在分布式事务中登记连接。 如果 Enlist=true,连接将自动在打开的线程的当前事务上下文中登记。 如果 Enlist=false,SqlClient 连接不会与分布式事务进行交互。 Enlist 的默认值为 true。 如果连接字符串中未指定 Enlist,若在连接打开时检测到一个,连接将自动在分布式事务中登记。  
Server=(local)SQL2005;Database=Northwind;Integrated Security=SSPI;auto-enlist=false


 

 

posted @ 2011-12-08 11:10 Byrd 阅读(20) 评论(0) 编辑
摘要: 1.以下可以进行linq、IList、List的模糊查询GetList().Where(o=>o.Name.IndexOf(term)>=0);// like '%???%'GetList().Where(o=>o.Name.StartsWith(term));//like '???%' GetList().Where(o=>o.Name.EndWith(term));// like '%???'阅读全文
posted @ 2011-12-02 10:46 Byrd 阅读(22) 评论(0) 编辑
摘要: 方法一://获取图片文件的二进制数据。byte[] datas =GetImage(tid);MemoryStream memStream = new MemoryStream(datas);memStream.WriteTo(context.Response.OutputStream);memStream.Close();context.Response.ContentType = "image/png";context.Response.StatusCode = 200;context.Response.End();方法二://获取图片文件的二进制数据。byte[] d阅读全文
posted @ 2011-11-24 09:59 Byrd 阅读(17) 评论(0) 编辑
摘要: //获取名为"MyClass"的类型 Type t = Type.GetType("MyClass"); //获取"MyClass"的属性 PropertyInfo[] properts = t.GetProperties(); //根据属性名获取某一属性 PropertyInfo p = t.GetProperty("Id"); //设置某一属性的值 MyClass my = new MyClass(); t.setValue(my, 123, null); 应用: public class BaseClass 阅读全文
posted @ 2011-11-09 14:32 Byrd 阅读(92) 评论(0) 编辑
摘要: 1, 有时对于一个Document来说,有一些Field会被频繁地操作,而另一些Field则不会。这时可以将频繁操作的Field和其他Field分开存 放,而在搜索时同时检索这两部分Field而提取出一个完整的Document。 这要求两个索引包含的Document的数量必须相同。 在创建索引的时候,可以同时创建多个IndexWriter,将一个Document根据需要拆分成多个包含部分Field的Document,并将这些Document分别添加到不同的索引。 而在搜索时,则必须借助ParallelReader类来整合。 ...阅读全文
posted @ 2011-11-08 22:23 Byrd 阅读(40) 评论(0) 编辑
摘要: 检索前,需要对检索字符串进行分析,这是由QueryParser来完成的。为了保证查询的正确性,最好用创建索引文件时同样的分析器。QueryParser解析字符串时,可以指定查询域,实际可以在字符串中指定一个或多个域。例如:“Info:电视台 AND ID:3329”,“Info:电视台”,“电视台”,假如不指定默认域,就会在默认域查询。QueryParser调用静态方法Parse后会返回Query的实例,原子查询。例如:“Info:电视台 AND ID:3329”会返回BooleanQuery,“Info:电视台”或“电视台”会返回PhraseQue...阅读全文
posted @ 2011-11-08 10:45 Byrd 阅读(46) 评论(0) 编辑