精华内容
下载资源
问答
  • statelesssession
    千次阅读
    2012-10-10 14:26:15
    无状态session指不记录操作状态,操作结束就结束了。
    有状态session记录操作状态,当一系列操作完成后才结束。所以它需要的资源多。
     
    StatelessSession没有持久化上下文,也不提供多少高层的生命周期语义。特别是,无状态session不实现第一级cache,也不和第二级缓存,或者查询缓存交互。它不实现事务化写,也不实现脏数据检查。用stateless session进行的操作甚至不级联到关联实例。stateless session忽略集合类(Collections)。通过stateless session进行的操作不触发Hibernate的事件模型和拦截器。无状态session对数据的混淆现象免疫,因为它没有第一级缓存。无状态session是低层的抽象,和低层JDBC相当接近。
    更多相关内容
  • Nhibernate的Session和StatelessSession性能比较 作者:邓家海 一个月入30K的大神有一天跟我说:我当年在你现在这个阶段,还在吊儿郎当呢!所以你努力吧! 有时候,一个想法就是1000秒,另一个想法只需要10秒 ...

    NhibernateSessionStatelessSession性能比较

    作者:邓家海

    一个月入30K的大神有一天跟我说:我当年在你现在这个阶段,还在吊儿郎当呢!所以你努力吧!

    有时候,一个想法就是1000秒,另一个想法只需要10秒

     

    前言:

    近段时间忙着给一个政府机关推送数据到国家数据库,数据量一共加起来有六十几万吧。这么多数据使用人工推送显然是一个不小的工作量,所以必须要使用程序来处理代码。为了方便,我们选择使用Nhibernate框架来进行CURD操作。有人大呼脑残,哈哈哈···为了方便偷懒,就是什么事情都敢做。六十几万,也算是一个大数据了吧。写程序可能才使用了三天左右的时间,然后就是跑数据。结果跑数据跑了两天多。1000条数据使用了1分钟左右。当时时间也很紧急,没有想太多。只好硬着头皮日夜加班跑数据。

    这段时间回来公司有空闲,后面还要继续推送数据。于是领导就交代我一个任务,想一个跑数据更快捷的方案。

     

    首先想到的是使用原生的ADO。但是,我又不甘心写太多代码,我在想为什么NHIBERNATE会这么慢?究竟是什么原因。查了一番资料。终于找到了可行的方案。自己顺便做了一个实验。证实此方案可行。原来是NHIBERNATE 的Session和StateLessSession这两个的原因。

     

    测试环境:

    Windows7

    Access

    Hibernate4

    数据量:20000数据

     

    首先看Session实现代码

     

     

      1 using System;
      2 
      3 using System.Collections.Generic;
      4 
      5 using System.Linq;
      6 
      7 using System.Text;
      8 
      9 using System.Threading.Tasks;
     10 
     11 using NHibernate;
     12 
     13 using NHibernate.Cfg;
     14 
     15  
     16 
     17 namespace BDC.Framework
     18 
     19 {
     20 
     21     public class DataSourceFactoryStateless
     22 
     23     {
     24 
     25         private static Dictionary<string, IStatelessSession> staticSessionDictionary = new Dictionary<string, IStatelessSession>();
     26 
     27         private static object lockObject = new object();
     28 
     29         private const  string OracleAssembly = "BDC.ZcServer";
     30 
     31         private const string AccessAssembly = "BDC.Standard";
     32 
     33  
     34 
     35         public static IStatelessSession GetSession<T>() where T:class
     36 
     37         {
     38 
     39             string assembly = typeof(T).Assembly.GetName().Name;
     40 
     41             IStatelessSession _session = null;
     42 
     43             bool isFind = false;
     44 
     45             if (staticSessionDictionary.Keys.Contains(assembly)) { _session = staticSessionDictionary[assembly]; isFind = true; }
     46 
     47             try
     48 
     49             {
     50 
     51                 if(_session == null)
     52 
     53                 {
     54 
     55                     lock (lockObject)
     56 
     57                     {
     58 
     59                         ISessionFactory factory = null;
     60 
     61                         switch (assembly) {
     62 
     63                             case OracleAssembly:
     64 
     65                                 factory = LoadOracleConfig();
     66 
     67                                 break;
     68 
     69                             case AccessAssembly:
     70 
     71                                 factory = LoadAccessConfig();
     72 
     73                                 break;
     74 
     75                             default:
     76 
     77                                 throw new Exception("没有找到对应的程序集");
     78 
     79                         }
     80 
     81                         // _session = factory.OpenSession();
     82 
     83                         _session=factory.OpenStatelessSession();
     84 
     85                         if (isFind) { staticSessionDictionary[assembly] = _session; }
     86 
     87                         else { staticSessionDictionary.Add(assembly, _session); }
     88 
     89                     }
     90 
     91                 }
     92 
     93  
     94 
     95                 return _session;
     96 
     97             }catch(Exception ex)
     98 
     99             {
    100 
    101                 throw new Exception("数据库初始化失败");
    102 
    103             }
    104 
    105         }
    106 
    107  
    108 
    109         private static ISessionFactory LoadOracleConfig()
    110 
    111         {
    112 
    113             Configuration config = new Configuration();
    114 
    115             config.SetProperty("dialect", "NHibernate.Dialect.Oracle10gDialect");
    116 
    117             config.SetProperty("hibernate.show_sql", "true");
    118 
    119             config.SetProperty("connection.driver_class", "NHibernate.Driver.OracleManagedDataClientDriver");
    120 
    121             config.SetProperty("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
    122 
    123             config.SetProperty("proxyfactory.factory_class", "NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate");
    124 
    125             config.SetProperty("connection.isolation", "ReadCommitted");
    126 
    127              config.SetProperty("connection.release_mode", "auto");
    128 
    129             config.SetProperty("adonet.batch_size", "500");
    130 
    131             config.SetProperty("current_session_context_class", "call");
    132 
    133             config.SetProperty("cache.use_query_cache", "false");
    134 
    135             config.AddAssembly("BDC.ZcServer");
    136 
    137             config.SetProperty("connection.connection_string", OracleConnectionString.ConnectionString);
    138 
    139  
    140 
    141             return config.BuildSessionFactory();
    142 
    143         }
    144 
    145  
    146 
    147         private static ISessionFactory LoadAccessConfig()
    148 
    149         {
    150 
    151             Configuration config = new Configuration();
    152 
    153             config.SetProperty("dialect", "NHibernate.JetDriver.JetDialect, NHibernate.JetDriver");
    154 
    155             config.SetProperty("hibernate.show_sql", "true");
    156 
    157             config.SetProperty("connection.driver_class", "NHibernate.JetDriver.JetDriver, NHibernate.JetDriver");
    158 
    159             config.SetProperty("connection.provider","NHibernate.Connection.DriverConnectionProvider");
    160 
    161             config.SetProperty("proxyfactory.factory_class", "NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate");
    162 
    163             config.SetProperty("connection.isolation", "ReadCommitted");
    164 
    165             config.SetProperty("connection.release_mode", "auto");
    166 
    167             config.SetProperty("adonet.batch_size", "500");
    168 
    169             config.SetProperty("current_session_context_class", "call");
    170 
    171             config.SetProperty("cache.use_query_cache", "false");
    172 
    173             config.AddAssembly("BDC.Standard");
    174 
    175             config.SetProperty("connection.connection_string", AccessConnectionString.ConnectionString);
    176 
    177  
    178 
    179             return config.BuildSessionFactory();
    180 
    181         }
    182 
    183  
    184 
    185  
    186 
    187     }
    188 
    189 }

     

     

     

     

    Session使用时间

     

     

     

    StatelessSession实现代码:

     

      1 using System;
      2 
      3 using System.Collections.Generic;
      4 
      5 using System.Linq;
      6 
      7 using System.Text;
      8 
      9 using System.Threading.Tasks;
     10 
     11 using NHibernate;
     12 
     13 using NHibernate.Cfg;
     14 
     15  
     16 
     17 namespace BDC.Framework
     18 
     19 {
     20 
     21     public class DataSourceFactory
     22 
     23     {
     24 
     25         private static Dictionary<string, ISession> staticSessionDictionary = new Dictionary<string, ISession>();
     26 
     27         private static object lockObject = new object();
     28 
     29         private const  string OracleAssembly = "BDC.ZcServer";
     30 
     31         private const string AccessAssembly = "BDC.Standard";
     32 
     33  
     34 
     35         public static ISession GetSession<T>() where T:class
     36 
     37         {
     38 
     39             string assembly = typeof(T).Assembly.GetName().Name;
     40 
     41             ISession _session = null;
     42 
     43             bool isFind = false;
     44 
     45             if (staticSessionDictionary.Keys.Contains(assembly)) { _session = staticSessionDictionary[assembly]; isFind = true; }
     46 
     47             try
     48 
     49             {
     50 
     51                 if(_session == null)
     52 
     53                 {
     54 
     55                     lock (lockObject)
     56 
     57                     {
     58 
     59                         ISessionFactory factory = null;
     60 
     61                         switch (assembly) {
     62 
     63                             case OracleAssembly:
     64 
     65                                 factory = LoadOracleConfig();
     66 
     67                                 break;
     68 
     69                             case AccessAssembly:
     70 
     71                                 factory = LoadAccessConfig();
     72 
     73                                 break;
     74 
     75                             default:
     76 
     77                                 throw new Exception("没有找到对应的程序集");
     78 
     79                         }
     80 
     81                         _session = factory.OpenSession();
     82 
     83                         if (isFind) { staticSessionDictionary[assembly] = _session; }
     84 
     85                         else { staticSessionDictionary.Add(assembly, _session); }
     86 
     87                     }
     88 
     89                 }
     90 
     91  
     92 
     93                 return _session;
     94 
     95             }catch(Exception ex)
     96 
     97             {
     98 
     99                 throw new Exception("数据库初始化失败");
    100 
    101             }
    102 
    103         }
    104 
    105  
    106 
    107         private static ISessionFactory LoadOracleConfig()
    108 
    109         {
    110 
    111             Configuration config = new Configuration();
    112 
    113             config.SetProperty("dialect", "NHibernate.Dialect.Oracle10gDialect");
    114 
    115             config.SetProperty("hibernate.show_sql", "true");
    116 
    117             config.SetProperty("connection.driver_class", "NHibernate.Driver.OracleManagedDataClientDriver");
    118 
    119             config.SetProperty("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
    120 
    121             config.SetProperty("proxyfactory.factory_class", "NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate");
    122 
    123             config.SetProperty("connection.isolation", "ReadCommitted");
    124 
    125              config.SetProperty("connection.release_mode", "auto");
    126 
    127             config.SetProperty("adonet.batch_size", "500");
    128 
    129             config.SetProperty("current_session_context_class", "call");
    130 
    131             config.SetProperty("cache.use_query_cache", "false");
    132 
    133             config.AddAssembly("BDC.ZcServer");
    134 
    135             config.SetProperty("connection.connection_string", OracleConnectionString.ConnectionString);
    136 
    137  
    138 
    139             return config.BuildSessionFactory();
    140 
    141         }
    142 
    143  
    144 
    145         private static ISessionFactory LoadAccessConfig()
    146 
    147         {
    148 
    149             Configuration config = new Configuration();
    150 
    151             config.SetProperty("dialect", "NHibernate.JetDriver.JetDialect, NHibernate.JetDriver");
    152 
    153             config.SetProperty("hibernate.show_sql", "true");
    154 
    155             config.SetProperty("connection.driver_class", "NHibernate.JetDriver.JetDriver, NHibernate.JetDriver");
    156 
    157             config.SetProperty("connection.provider","NHibernate.Connection.DriverConnectionProvider");
    158 
    159             config.SetProperty("proxyfactory.factory_class", "NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate");
    160 
    161             config.SetProperty("connection.isolation", "ReadCommitted");
    162 
    163             config.SetProperty("connection.release_mode", "auto");
    164 
    165             config.SetProperty("adonet.batch_size", "500");
    166 
    167             config.SetProperty("current_session_context_class", "call");
    168 
    169             config.SetProperty("cache.use_query_cache", "false");
    170 
    171             config.AddAssembly("BDC.Standard");
    172 
    173             config.SetProperty("connection.connection_string", AccessConnectionString.ConnectionString);
    174 
    175  
    176 
    177             return config.BuildSessionFactory();
    178 
    179         }
    180 
    181  
    182 
    183  
    184 
    185     }
    186 
    187 }
    188 
    189  

     

     

    StatelessSession使用时间

     

     

     

     

     

     

    ADO执行原生SQL

     

     1 using System;
     2 
     3 using System.Collections.Generic;
     4 
     5 using System.Data.OleDb;
     6 
     7 using System.Linq;
     8 
     9 using System.Text;
    10 
    11 using System.Threading.Tasks;
    12 
    13  
    14 
    15 namespace BDC.Standard
    16 
    17 {
    18 
    19     public class AccessConnectionTest
    20 
    21     {
    22 
    23         public bool AccessTest()
    24 
    25         {
    26 
    27             OleDbConnection mycon = null;
    28 
    29             OleDbCommand mycom = null;
    30 
    31             try {
    32 
    33                 string strcon = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\XXXXXXSXB.mdb;";
    34 
    35                 mycon = new OleDbConnection(strcon);
    36 
    37                 mycom = mycon.CreateCommand();
    38 
    39                 mycon.Open();
    40 
    41               
    42 
    43                 for( int j= 0; j < 20000; j++)
    44 
    45                 {
    46 
    47  
    48 
    49  
    50 
    51  
    52 
    53                     string sql = string.Format("insert into sqr(QLRDLJG,QLRDLRDH,QLRDLRMC,QLRFRDH,QLRFRMC,QLRMC,QLRTXDZ,QLRYB,QLRZJH,QLRZJZL,QXDM,YSDM,YWH,YWRDLJG,YWRDLRDH,YWRDLRMC,YWRFRDH,YWRFRMC,YWRMC,YWRTXDZ,YWRYB,YWRZJH,YWRZJZL) values('1','1','1','1','1','1','1','1','1','1','1','1',{0},'1','1','1','1','1','1','1','1','1','1') ", j);
    54 
    55                     mycom.CommandText = sql;
    56 
    57                     int i = mycom.ExecuteNonQuery();
    58 
    59                 }
    60 
    61               
    62 
    63                 
    64 
    65  
    66 
    67                 return true;
    68 
    69             }
    70 
    71             catch(Exception ex)
    72 
    73             {
    74 
    75                 return false;
    76 
    77             }
    78 
    79             finally
    80 
    81             {
    82 
    83                 mycom.Dispose();
    84 
    85                 mycon.Close();
    86 
    87                 
    88 
    89  
    90 
    91             }
    92 
    93         }
    94 
    95     }
    96 
    97 }

     

     

     

    ADO执行原生SQL使用时间:

     

     

     

     

     

     

     

     

     

     

     

    解析:综上就发现,Session效率非常低下,足足运行了1000多秒,就是23多分钟。再看后面两种方法,效率差不多。一个10秒,一个11秒。这么说,我其实还是可以偷懒的。继续使用NHIBERNATE,只需要换一个方法就可以了。那么?为什么这两个方法差别如此大呢。而且前面的方法运行一段时间会失败并抛出内存溢出异常,这是因为 Hibernate 把所有新插入的MotherCat实例在 session 级别的缓存区进行了缓存的缘故。其实不知道你们发现没有,StatelessSession 接口使用insert, update和 delete操作是操作数据库的, Session 使用save, saveOrUpdate 和delete 。区别就在Save和Insert这两个方法。

    原因:使用StatelessSession(无状态 session)接口是使用流的方式来操作数据,大大提升效率。它没有持久上下文。不存在高层的生命周期。没有多级缓存,它也不管你数据的准确性,是否重复,是否存在脏数据,不级联更新数据。也不会出发Hibernate的事务和触发器等,简单的来说,就相当于一个底层的JDBC。

     

    使用注意:它没有事务,没有缓存,没有脏数据检查。所以我们使用在系统的时候,千万要小心使用,不然会造成脏数据,污染数据库,或者导致数据不正确。而且如果系统抛异常,则是很危险的,数据是马上执行存取操作的。数据写到一半,抛个异常,这个数据就错了。而且还不会回滚。

     

    综上,对已有数据,要求效率的时候,而且保证数据不会出现问题,异或,自己对异常,脏数据等有一套方案,可以使用NHIBERNATE的StateLessSession.不是特别追求速度的话,还是使用Session。

     

     

     

    转载于:https://www.cnblogs.com/dengjiahai/p/6953367.html

    展开全文
  • 关于Drools: Drools是jboss的一款开源的业务规则引擎,具有速度快、效率高、易学习的特点。 让我们从使用驾驶执照申请的一个非常简单的例子开始。 (1)首先我们需要创建一个maven项目,需要添加的依赖为: ...

    关于Drools:
    Drools是jboss的一款开源的业务规则引擎,具有速度快、效率高、易学习的特点。
    本文内容参考自Drools 官方文档 7.9.0.Final版
    https://docs.jboss.org/drools/release/7.9.0.Final/drools-docs/html_single/index.html
    让我们从使用驾驶执照申请的一个非常简单的例子开始。
    (1)首先我们需要创建一个maven项目,需要添加的依赖为:

    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>7.5.0.Final</version>
    </dependency>

    (2)接着我们需要创建一个POJO类

    public class Applicant {
        private String name;
        private int age;
        private boolean valid;
        // getter and setter methods here
    }

    现在我们有了数据模型,我们可以开始编写第一条规则。由于这是一个简单的验证用例,我们将添加一条规则来取消任何年龄小于18岁的申请人的资格。

    package org.drools.examples.helloworld.entity
    
    rule "Is of valid age"
    when 
        $a : Applicant(age>18)
    then
        $a.setValid(true);
    end

    我们需要将上面的内容放到src\mian\resources目录下,并将其命名为 .drl格式的文件。
    drl 即Drools Rule Language。在这里我们将其命名为license.drl,同时,在我们的maven项目中还需要创建一个kmodule.xml,这个文件需要放到resources\META-INF文件夹下,由于Drools 已为我们提供有意义的默认值,因此最简单的kmodule.xnl只需要包含一个空的kmodule标签即可,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <kmodule xmlns="http://www.drools.org/xsd/kmodule"/>

    我们接着看上面的drl文件,会发现它和java的语法非常类似。
    package : 所用到的pojo类的位置
    rule : 规则名称,这里可以是任意值,但需要保持唯一性
    when…then…end : 当满足某种条件时,就如何如何,以end做结尾
    $a$a是一个绑定变量,它允许我们的引用匹配的对象,美元字符$是可选的,用于区分变量名和字段名,在这里绑定一个变量用的是 “:”
    Applicant( age < 18 ) : Applicant 则是我们的数据模型,age<18则是判断条件

    (3)调用规则,使规则生效

    KieServices kieServices = KieServices.Factory.get();
    KieContainer kieContainer = kieServices.getKieClasspathContainer();

    上面这段代码使我们在类路径下找到所有的DRL文件,并将此编译的结果kiemodule放到 kieContainer中。如果没有错误,我们现在可以从kiecontainer中执行一些数据:

    StatelessKieSession kieSession = kieContainer.newStatelessKieSession();
    Applicant app = new Applicant();
    app.setName("liuyang");
    app.setAge(19);
    Assert.assertFalse(app.isValid());
    System.out.println("执行规则前:"+app.toString());
    kieSession.execute(app);
    System.out.println("执行规则后:"+app.toString());
    Assert.assertTrue(app.isValid());

    到此为止,未满18岁的申请人,都会被标记为无效。
    这里写图片描述

    上述例子只对申请人的年龄做了处理,若此时想对申请日期做判断的话该如何处理呢?Drools实现了对多个实例对象的判断。此时我们将Applicant中的valid移到Application中。

    public class Applicant {
        private String name;
        private int age;
    // 省略 get set
    }
    public class Application {
        private String dateApplied;
        private boolean valid;
    // 省略 get set
    }

    我们再添加另一条规则来验证其申请日期是否在我们规定的范围。

    package org.drools.examples.helloworld.exam2
    
    
    rule "Is of valid age"
    when 
        Applicant( age > 18 )
        $a : Application()
    then
        $a.setValid(true);
    end
    
    rule "Application was made this year"
    when 
        $a : Application(dateApplied > "2018-01-01" )
    then 
        $a.setValid(false);
    end

    通过Arrays.asList(…)将这两个实例放入集合中,按照放入的顺序执行drl中的规则

    public class MyTest {
        public static void main(String[] args) {
            KieServices kieServices = KieServices.Factory.get();
            KieContainer kieContainer = kieServices.getKieClasspathContainer();
    
            StatelessKieSession kieSession = kieContainer.newStatelessKieSession();
            Applicant applicant = new Applicant("liuyang", 20);
            Application application = new Application();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            application.setDateApplied(df.format(new Date()));
            System.out.println("执行规则前:" + application.toString());
            kieSession.execute(Arrays.asList(applicant , application ));
            System.out.println("执行规则后:" + application.toString());
        }
    }

    由于Arrays.asList中先放入的是applicant,因此会先执行”Is of valid age”这条规则,因为20>18,因此此时的valid为true。接着执行”Application was made this year”这条规则,此时日期为2018-08-11,大于规则中的2018-01-01,因此valid为false.
    这里写图片描述

    展开全文
  • stateless session 无状态会话 Drools规则引擎中有如此多的用例和诸多功能,它变得令人难以置信。不过不用担心,复杂性是分层的,你可以用简单的用例来逐步了解drools。 无状态会话,不使用推理,形成最简单的用例...

    stateless session 无状态会话

    Drools规则引擎中有如此多的用例和诸多功能,它变得令人难以置信。不过不用担心,复杂性是分层的,你可以用简单的用例来逐步了解drools。

    无状态会话,不使用推理,形成最简单的用例。无状态会话可以被称为函数传递一些数据,然后再接收一些结果。无状态会话的一些常见用例有以下但不限于:

    1. 验证 
      这个人有资格获得抵押吗?
    2. 计算 
      计算抵押保费。
    3. 路由和过滤 
      将传入的邮件(如电子邮件)过滤到文件夹中。 
      将传入的邮件发送到目的地。

    所以让我们从使用驾驶执照应用程序的一个非常简单的例子开始吧。

    public class Applicant {
        private String name;
        private int age;
        private boolean valid;
        // getter and setter methods here
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    现在我们有了我们的数据模型,我们可以写出我们的第一个规则。我们假设应用程序使用规则来拒绝不符合规则的申请。由于这是一个简单的验证用例,我们将添加一条规则来取消任何18岁以下的申请人的资格。

    package com.company.license
    
    rule "Is of valid age"
    when
        $a : Applicant( age < 18 )
    then
        $a.setValid( false );
    end
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    为了使引擎了解数据,所以可以根据规则进行处理,我们必须插入数据,就像数据库一样。当申请人实例插入到引擎中时,将根据规则的约束进行评估,在这种情况下,这只是一个规则的两个约束条件。我们说两个,因为申请人类型是第一个对象类型约束,而age <18是第二个字段约束。对象类型约束及其零个或多个字段约束被称为模式。当插入的实例同时满足对象类型约束和所有字段约束时,它被称为匹配。$a是一个绑定变量,它允许我们引用匹配的对象。其属性可以更新。美元字符(’$’)是可选的,但它有助于区分变量名称和字段名称。匹配模式与插入数据的过程并不奇怪,通常被称为模式匹配。

    要使用这个规则,有必要把它放在一个Drools文件中,只是一个带有.drl扩展名的纯文本文件,简称为“Drools Rule Language”。我们来调用licenseApplication.drl这个文件,并将其存储在Kie Project中。 Kie项目具有正常的Maven项目的结构,并附加一个可以创建的KieBaseKieSession文件(kmodule.xml)。该文件必须放在Maven项目的resources/META-INF文件夹中,而所有其他Drools工件(如包含前一规则的licenseApplication.drl)必须存储在资源文件夹或其下的任何其他子文件夹中。

    由于为所有配置方面提供了有意义的默认值,所以最简单的kmodule.xml文件只能包含一个空的kmodule标签,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <kmodule xmlns="http://www.drools.org/xsd/kmodule"/>
    • 1
    • 2

    此时,可以从类路径创建一个KieContainer来读取要构建的文件。

    KieServices kieServices = KieServices.Factory.get();
    KieContainer kContainer = kieServices.getKieClasspathContainer();
    • 1
    • 2

    上面的代码段编译了类路径中找到的所有DRL文件,并将该编译结果KieModule放在KieContainer中。如果没有错误,我们现在可以从KieContainer创建我们的会话并执行一些数据:

    StatelessKieSession kSession = kContainer.newStatelessKieSession();
    Applicant applicant = new Applicant( "Mr John Smith", 16 );
    assertTrue( applicant.isValid() );
    ksession.execute( applicant );
    assertFalse( applicant.isValid() );
    • 1
    • 2
    • 3
    • 4
    • 5

    上述代码根据规则执行数据。由于申请人年龄未满18岁,申请被标记为无效。

    到目前为止,我们只使用了一个实例,但是如果我们想要使用多个实例呢?我们可以执行任何实现Iterable的对象,如集合。我们再添加一个名为Application的类,它有应用程序的日期,我们还将布尔有效字段移到Application类。

    public class Applicant {
        private String name;
        private int age;
        // getter and setter methods here
    }
    
    public class Application {
        private Date dateApplied;
        private boolean valid;
        // getter and setter methods here
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    我们还将添加另一条规则来验证申请是否在一段时间内进行。

    package com.company.license
    
    rule "Is of valid age"
    when
        Applicant( age < 18 )
        $a : Application()     
    then
        $a.setValid( false );
    end
    
    rule "Application was made this year"
    when
        $a : Application( dateApplied > "01-jan-2009" )     
    then
        $a.setValid( false );
    end
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    不幸的是,Java数组不实现Iterable接口,所以我们必须使用JDK转换器方法Arrays.asList(…)。下面显示的代码针对一个可迭代列表执行,其中在触发任何匹配的规则之前插入所有集合元素。

    StatelessKieSession kSession = kContainer.newStatelessKieSession();
    Applicant applicant = new Applicant( "Mr John Smith", 16 );
    Application application = new Application();
    assertTrue( application.isValid() );
    ksession.execute( Arrays.asList( new Object[] { application, applicant } ) );
    assertFalse( application.isValid() );
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行的两个执行方法(Object object)和execute(Iterable对象)实际上是接口BatchExecutor的方法execute(Command命令)的便利方法。

    KieCommands命令工厂可以像KIE A​​PI的所有其他工厂一样从KieServices获取,用于创建命令,以便以下操作相当于执行(Iterable it):

    ksession.execute( kieServices.getCommands().newInsertElements( Arrays.asList( new Object[] { application, applicant } ) );
    • 1

    批处理执行器和命令工厂在使用多个命令和输出标识符以获取结果时特别有用。

    KieCommands kieCommands = kieServices.getCommands();
    List<Command> cmds = new ArrayList<Command>();
    cmds.add( kieCommands.newInsert( new Person( "Mr John Smith" ), "mrSmith", true, null ) );
    cmds.add( kieCommands.newInsert( new Person( "Mr John Doe" ), "mrDoe", true, null ) );
    BatchExecutionResults results = ksession.execute( kieCommands.newBatchExecution( cmds ) );
    assertEquals( new Person( "Mr John Smith" ), results.getValue( "mrSmith" ) );
    展开全文
  • Stateless Session Bean的用法

    千次阅读 2016-04-06 17:56:45
    当客户机和服务器建立连接之后,状态会话 Bean (Stateful Session Bean) 将一直在客户机和服务器之间保持着用户的某个状态。例如:用户使用银行的ATM时,经过验证之后,用户可以连续执行多次操作,在这个过程当中,...
  • package examples.ejb20.basic.statelessSession; import java.rmi.RemoteException; import javax.ejb.EJBObject; public interface Trader extends EJBObject { public TradeResult buy (String s...
  • StatelessSession (无状态session)接口 作为选择,Hibernate提供了基于命令的API,可以用detached object的形式把数据以流的方法加入到数据库,或从数据库输出。StatelessSession没有持久化上下文,也不提供多少...
  • 在本文主要介绍如何来开发一...开发EJB3 Stateless Session Bean要比开发EJB2 Stateless Session Bean容易得多,只需要几个注释就可以搞定。读者可按如下的步骤来开发和调用EJB3 Stateless Session Bean:  第1...
  • EJB 3.0入门:Stateless Session Beans

    千次阅读 2007-04-10 14:26:00
    一个EJB 3.0 session bean是一个由EJB容器管理的POJO。在这个例子的以后部分我们将看到,一个session bean允许我们使用容器的安全,事务,消息,持久,和其他服务。 一个session bean的功能由它的服务interface ...
  • Hibernate_StatelessSession

    2014-12-03 20:05:00
     StatelessSession statelessSession = HibernateUtil.getSessionFactory().  openStatelessSession();  Transaction tx = statelessSession.getTransaction();  tx.begin();  Role role = (Role) ...
  • 在上一篇blog中我写到了一个困饶我的问题,就是如何在stateless session bean中的一个方法内如果有多个数据库操作,怎样维持它们的事务性,经过实验,下面给出它的一种解决方法。首先像这样的问题我们应该相信ejb是...
  • 1.Stateless Session Bean的原理:不是说EJB不可以有状态,而是说EJB不对他 的状态做管理,这一点在EJB中是通过单例来实现的;因为是单例的所以不能区 分不同的客户端的状态,也就是说再分布式的设计中:如果一...
  • 歪解stateful session bean 和 stateless session bean的区别。无状态bean嘛,比如在家里你要上厕所,无状态bean每次提供得是全新的马桶,有状态提供得是上次(一个session或者application)你用过得马桶,里面是你上次拉...
  • 但是我只是尝试使用StatelessSession做同样的事情.原因是我只是试图选择用于创建报告的数据,但是我想最大化速度并最小化内存消耗,但是   public static List<Song> getSongsWithCoverArtFromDatabase...
  • Stateful Session Bean与Stateless Session Bean的区别: Stateful Session Bean与Stateless Session Bean 1、同时都可以执行系统的业务逻辑, 2、不同的是,Stateful Session Bean 可以记录客户端调用者的状态,...
  • 1,Stateless Session Beans(无状态bean)开发 1,1开发只存在Remote接口的无状态Session Bean 步骤: 1) 要定义一个会话bean,首先必须定义一个包含他所有业务方法的接口,这个接口不需要任何注释,他的定义...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,344
精华内容 7,337
关键字:

statelesssession