对于TeaFramework——ORM框架的实现感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解一,并且为您提供关于.NetFramework4.7或仅.NetFramework2.0上的W
对于TeaFramework——ORM框架的实现感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解一,并且为您提供关于.Net Framework 4.7或仅.Net Framework 2.0上的Winforms是否兼容Mono?、Entity Framework框架 (一)、org.apache.curator.framework.CuratorFramework的实例源码、org.apache.curator.framework.imps.CuratorFrameworkState的实例源码的宝贵知识。
本文目录一览:- TeaFramework——ORM框架的实现(一)(orm框架有哪些优缺点)
- .Net Framework 4.7或仅.Net Framework 2.0上的Winforms是否兼容Mono?
- Entity Framework框架 (一)
- org.apache.curator.framework.CuratorFramework的实例源码
- org.apache.curator.framework.imps.CuratorFrameworkState的实例源码
TeaFramework——ORM框架的实现(一)(orm框架有哪些优缺点)
一、实现要求
1、数据访问层的职责是对数据库进行增删改查的操作,所以可以非常单一,仅仅只需要一个inteface即可搞定;
2、全自动ORM不利于SQL的优化与SQL的定制,所以TeaFrameWork ORM准备用半自动的方式实现,开发人员需要写SQL;
3、告别配置文件,纯注解;
4、接口每个方法只需要一个参数,可以是PO对象、可以是MAP、可以是8大基本数据类型+String和Date
5、动态绑定SQL
6、支持Oracle、Mysql
7、自动分页
8、占位符用#号,如:#id#,#name#,这个和ibatis一致
二、分析
1、设计上ORM只需要inteface,那么具体实现类必须由框架生成,对比了很多字节码生成工具之后,决定采用cglib
2、对数据库的操作,本质上只有两种:读、写。
(1)、读即Select语句,返回值类型:8大基本数据类型+String和Date、PO对象、List<PO对象>、List<Map<String,Object>>,这里我们限定了返回的类型,基本上满足了日常开发
(2)、写:insert、update、delete等,insert操作中有个主键获取问题,可以自动生成,也可以写SQL获得,例如Oracle的select s_users.nextval from dual
三、具体实现
1、注解
(1)、@TeaDao标示这个inteface是数据访问层,让bean容器启动时可以扫描到
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TeaDao {
public String value() default "";
}
(2)、@SQL给具体方法绑定SQL语句,如:@SQL("select * from users") public List<User> getAllUser();
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SQL {
public String value();
}
(3)、@GetPrimaryKey注解生成主键的语句,通常和insert语句配合使用
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface GetPrimaryKey {
public String sql();
public String primaryKeyProperty();
}
如:
@GetPrimaryKey(sql = "select s_users.nextval from dual", primaryKeyProperty = "id")
@SQL("insert into users(id,name,password,createdate) values(#id#,#name#,#password#,#createdate#)")
public int add(Map<String, Object> map);
(4)、@AutoIncrement注解新增时由数据库自动生成主键,和新增配合使用
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AutoIncrement {
}
(5)、@DynamicSQL注解方法的SQL是动态传入,在查询场景下使用
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DynamicSQL {
}
2、代理类OrmProxy,具体拦截inteface的方式,执行SQL
public class OrmProxy implements InterfaceExecutor {
private final static String SELECT = "select";
private final static String INSERT = "insert";
private static OrmProxy instance;
private OrmProxy() {
}
public synchronized static OrmProxy getInstance() {
if (instance == null) {
instance = new OrmProxy();
}
return instance;
}
@Override
public Object invoke(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
if (method.getDeclaringClass().equals(java.lang.Object.class)) {
return proxy.invokeSuper(obj, args);
}
if (!method.isAnnotationPresent(SQL.class) && !method.isAnnotationPresent(DynamicSQL.class)) {
throw new TeaOrmException("没有绑定SQL");
}
if (args != null && args.length > 1) {
throw new TeaOrmException("只能传递一个参数");
}
if (method.isAnnotationPresent(GetPrimaryKey.class) && method.isAnnotationPresent(AutoIncrement.class)) {
throw new TeaOrmException("GetPrimaryKey和AutoIncrement不能同时注解在一个方法上");
}
if (method.getAnnotation(SQL.class) != null && method.getAnnotation(DynamicSQL.class) != null) {
throw new TeaOrmException("SQL和DynamicSQL不能同时注解在一个方法上");
}
if (TranscationThreadVariable.get() == null || !TranscationThreadVariable.get()) {
if (ConnectionThreadVariable.getConnetion() == null) {
ConnectionThreadVariable.setConnetion(DataSourceHelp.getConnection());
}
}
try {
if (method.isAnnotationPresent(SQL.class)) {
String sql = method.getAnnotation(SQL.class).value().trim();
AbstractDataBind dataBind = DataBindFactory
.getDataBind(args == null || args.length == 0 ? null : args[0]);
if (!SELECT.equalsIgnoreCase(sql.substring(0, 6))) {
boolean isAutoIncrement = false;
if (INSERT.equalsIgnoreCase(sql.substring(0, 6))) {
if (method.getAnnotation(AutoIncrement.class) != null) {
isAutoIncrement = true;
}
if (method.getAnnotation(GetPrimaryKey.class) != null) {
Object object = dataBind.fillPrimaryKey(method, args[0]);// 填充主键
dataBind.excuteUpdate(sql, args == null || args.length == 0 ? null : args[0],
isAutoIncrement);
return object;
}
}
return dataBind.excuteUpdate(sql, args == null || args.length == 0 ? null : args[0],
isAutoIncrement);
} else {
return QueryResultProcesser.createQueryResult(
dataBind.excuteQuery(sql, args == null || args.length == 0 ? null : args[0]), method);
}
} else if (method.isAnnotationPresent(DynamicSQL.class)) {
String sql = DynamicSqlUtil.get() == null ? null : DynamicSqlUtil.get().trim();
if (null == sql || "".equals(sql)) {
throw new TeaOrmException("SQL语句不能为空");
}
if (sql.length() < 6 || !SELECT.equalsIgnoreCase(sql.substring(0, 6))) {
throw new TeaOrmException("只能绑定select语句");
}
return QueryResultProcesser.createQueryResult(DataBindFactory.getDataBind(null).excuteQuery(sql,
args == null || args.length == 0 ? null : args[0]), method);
}
} catch (Exception e) {
throw new TeaOrmException(e);
} finally {
if (TranscationThreadVariable.get() == null || !TranscationThreadVariable.get()) {
ConnectionThreadVariable.getConnetion().close();
ConnectionThreadVariable.clearThreadVariable();
}
}
return null;
}
}
代码解释:
(1)、用于都是method执行,没有共享变量,所以没有线程安全问题,故而这里用单例模式
(2)、获取SQL分两大块,动态SQL和固定注解SQL,动态SQL只用于查询场景。对于新增,需要获取主键生成方案(sql生成和自动生成)
(3)、InterfaceExecutor接口会在Bean容器设计中详细讲到
(4)、Transcation相关的代码,会在事务设计中详细讲到
自此,一个ORM核心的代码已经完成,剩下SQL的执行过程、占位符替换,请关注《TeaFramework——ORM框架的实现(二)》
项目地址:https://git.oschina.net/lxkm/teaframework
博客:https://my.oschina.net/u/1778239/blog
.Net Framework 4.7或仅.Net Framework 2.0上的Winforms是否兼容Mono?
如何解决.Net Framework 4.7或仅.Net Framework 2.0上的Winforms是否兼容Mono??
根据此处的信息https://www.mono-project.com/docs/about-mono/compatibility/,Mono支持Winforms的最高版本(基于哪个.Net Framework)?我认为同一页面上这两个引用中的信息是矛盾的:
“描述Mono当前支持的最简单方法是: .NET 4.7中的所有内容(WPF,WWF除外),以及WCF受限和ASP.NET异步堆栈受限。”据我了解,WWF决定使用Windows Workflow Foundation,因此这意味着Winforms在.Net Frameork 4.7上由Mono支持。这应该很清楚。但是然后:
“ .NET 2.0复选标记:Winforms / System.Drawing 2.0 ”由于未提及在任何更高版本的.NET上实现的Winforms,这使我认为没有更高版本的Winforms。然后支持.Net Framework 2.0。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Entity Framework框架 (一)
1. Entity Framework的详细介绍:
Entity Framework简称EF,与Asp.net关系与Ado.net关系。
Entity Framework是ado.net中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。
ORM:object relation mapping 是基于关系型数据库的数据储备,实现一个模拟的面向对象的数据访问接口,理想情况下,基于这样一个面向对象的接口,持久化一个oo对象应该不需要了解任何关系型数据库存储数据的实现细节。
类似的轻量级的orm框架,dapper,patapoct
1. lambda表达式:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
//定义一个委托
public delegate int AddSum(int a,int b);
class Program
{
static void Main(string[] args)
{
Program p = new Program();
// AddSum addSum = new AddSum(p.Add);
// AddSum addSum = delegate(int a, int b) { return a + b; };
//AddSum addSum = (int a, int b) => { return a + b; };
//简化之后的lambda表达式
AddSum addSum = ( a, b) => { return a + b; };
int sum = addSum(5, 3);
Console.WriteLine(sum);
Console.ReadKey();
}
//public int Add(int a, int b)
//{
// return a + b;
//}
}
}
一、第一种使用EF的方法:先有数据库再建立数据模型
1. 在项目中右击新建,新建一个ADO.net实体数据模型,选择从数据库生成,这种是先有数据库再建立数据模型的方式。然后依次点击下一步便可,完成以后切记点击ctrl+s保存。不然是不会生成数据模型对应的类。
2. 注意:对应的数据库表必须有主键,不然在使用时会报错。
3. 生成之后的结构如下。
4.使用EF进行相关的增删改查代码如下:
新建的web窗体页面,分别放四个button按钮便可。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.UI;
6 using System.Web.UI.WebControls;
7
8 namespace WebApplication2
9 {
10 public partial class WebForm1 : System.Web.UI.Page
11 {
12 protected void Page_Load(object sender, EventArgs e)
13 {
14
15 }
16 /// <summary>
17 /// 插入数据
18 /// </summary>
19 /// <param name="sender"></param>
20 /// <param name="e"></param>
21 protected void Button1_Click(object sender, EventArgs e)
22 {
23 UserInfo UserInfo = new UserInfo();
24 UserInfo.UserName = "张五呀";
25 UserInfo.UserPass = "123qwe";
26 UserInfo.RegTime = 2;
27 UserInfo.Email = "wangjin";
28 AdwResourcesEntities1 db = new AdwResourcesEntities1();
29 //将数据添加到EF中,并且添加了标记,并且类似于生成了一条insert语句,但是这时候还没有执行该语句
30 db.UserInfo.Add(UserInfo);
31 //之后执行该代码时,才会执行insert语句,并且返回受影响行数
32 db.SaveChanges();
33 //返回刚刚插入的主键ID
34 Response.Write(UserInfo.ID);
35 }
36 /// <summary>
37 /// 查询数据
38 /// </summary>
39 /// <param name="sender"></param>
40 /// <param name="e"></param>
41 protected void Button2_Click(object sender, EventArgs e)
42 {
43 AdwResourcesEntities1 db = new AdwResourcesEntities1();
44 var userinfolist = from u in db.UserInfo //linq表达式
45 where u.ID == 65
46 select u;
47 //EF的延迟加载机制,只有数据在使用的时候才会去数据库中查询,不用的时候不查询。
48 //只有执行下面的代码的时候才会去执行,这样可以提高整体的性能
49 foreach (var userinfo in userinfolist)
50 {
51 Response.Write(userinfo.ID);
52 }
53 //FirstOrDefault 查询第一条数据或者查询默认值
54 //userinfolist.FirstOrDefault();
55 }
56 /// <summary>
57 /// 删除数据
58 /// </summary>
59 /// <param name="sender"></param>
60 /// <param name="e"></param>
61 protected void Button3_Click(object sender, EventArgs e)
62 {
63 AdwResourcesEntities1 db = new AdwResourcesEntities1();
64 var userinfolist = from u in db.UserInfo
65 where u.ID == 66
66 select u;
67 //返回第一条数据,如果没有就放回null
68 UserInfo userinfo = userinfolist.FirstOrDefault();
69 if (userinfo != null)
70 {
71 db.UserInfo.Remove(userinfo);
72 db.SaveChanges();
73 Response.Write("删除成功");
74 }
75 else
76 {
77 Response.Write("数据有误");
78 }
79
80 ////执行删除的第二种方法
81 //UserInfo userInfo = new UserInfo() {ID=344};
82 db.Entry<UserInfo>(userinfo).State = System.Data.Entity.EntityState.Deleted;
83 //db.SaveChanges();
84 }
85
86 /// <summary>
87 /// 修改数据
88 /// </summary>
89 /// <param name="sender"></param>
90 /// <param name="e"></param>
91 protected void Button4_Click(object sender, EventArgs e)
92 {
93 //构建一个
94 AdwResourcesEntities1 db = new AdwResourcesEntities1();
95 var userinfolist = from u in db.UserInfo
96 where u.ID == 65
97 select u;
98 UserInfo userinfo = userinfolist.FirstOrDefault();
99 userinfo.UserPass = "qweqwe";
100 db.Entry<UserInfo>(userinfo).State = System.Data.Entity.EntityState.Modified;
101 db.SaveChanges();
102 Response.Write("修改成功");
103 }
104 }
105 }
二、第二种ModelFirst模式使用EF的方法,先建立数据模型,再生成数据库对应的表。
1. 先在数据库中新建一个数据库。
2. 在项目中右击新建项目,选择数据源,点击空模型。
3. 在生成的空白界面中,右击新增实体,新增之后再新增标量属性,如果是多表,并且有关联的表,右击新增关联,再右击根据数据模型生成数据库。
4. 点击如下文件,需要点击执行才会生成数据库。
5. 使用第二种进行增删改查的相关代码如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.UI;
6 using System.Web.UI.WebControls;
7
8 namespace WebApplication1
9 {
10 public partial class WebForm2 : System.Web.UI.Page
11 {
12 protected void Page_Load(object sender, EventArgs e)
13 {
14
15 }
16 /// <summary>
17 /// 插入数据
18 /// </summary>
19 /// <param name="sender"></param>
20 /// <param name="e"></param>
21 protected void Button1_Click(object sender, EventArgs e)
22 {
23 Model2Container db = new Model2Container();
24 Customer customer = new Customer() {CustomerName="zhangsan",CustomerPwd="123", SubTime=DateTime.Now };
25 // Customer = customer导航属性,代表下面的数据属于上面的值
26 OrderInfo orderInfo1 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "10001", CreateDateTime = DateTime.Now,Customer=customer };
27 OrderInfo orderInfo2 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "10002", CreateDateTime = DateTime.Now, Customer = customer };
28 db.Customer.Add(customer);
29 db.OrderInfo.Add(orderInfo1);
30 db.OrderInfo.Add(orderInfo2);
31 db.SaveChanges();//默认的已经开启了事务。 工作单元模式。(UnitOfwork)
32 }
33 /// <summary>
34 /// 查询数据
35 /// </summary>
36 /// <param name="sender"></param>
37 /// <param name="e"></param>
38 protected void Button2_Click(object sender, EventArgs e)
39 {
40 Model2Container db = new Model2Container();
41 var customerList = from c in db.Customer
42 select c;
43 foreach (var customer in customerList)
44 {
45 Response.Write(customer.CustomerName+":");
46
47
48 foreach (var orderInfo in customer.OrderInfo)//延迟加载。
49 {
50 Response.Write(orderInfo.OrderNum);
51 }
52 }
53 }
54 /// <summary>
55 /// 根据名字id查询所有的订单
56 /// </summary>
57 /// <param name="sender"></param>
58 /// <param name="e"></param>
59 protected void Button3_Click(object sender, EventArgs e)
60 {
61 Model2Container db = new Model2Container();
62 //var customerInfoList = from c in db.Customer
63 // where c.ID == 1
64 // select c;
65 //var customerInfo = customerInfoList.FirstOrDefault();
66 //foreach (var orderInfo in customerInfo.OrderInfo)
67 //{
68 // Response.Write(orderInfo.OrderNum);
69 //}
70
71 var orderInfoList = from o in db.OrderInfo
72 where o.CustomerID == 1
73 select o;
74 foreach (var orderInfo in orderInfoList)
75 {
76 Response.Write(orderInfo.OrderNum);
77 }
78
79 }
80 /// <summary>
81 /// 输出10001对应的客户ID
82 /// </summary>
83 /// <param name="sender"></param>
84 /// <param name="e"></param>
85 protected void Button4_Click(object sender, EventArgs e)
86 {
87 Model2Container db = new Model2Container();
88 var orderInfoList = from o in db.OrderInfo
89 where o.OrderNum == "10001"
90 select o;
91 var orderInfo = orderInfoList.FirstOrDefault();
92 Customer customer = orderInfo.Customer;
93 Response.Write(customer.CustomerName);
94 }
95 /// <summary>
96 /// 根据人员ID删除对应数据
97 /// </summary>
98 /// <param name="sender"></param>
99 /// <param name="e"></param>
100 protected void Button5_Click(object sender, EventArgs e)
101 {
102 Model2Container db = new Model2Container();
103 //var customer = (from c in db.Customer
104 // where c.ID == 1
105 // select c).FirstOrDefault();
106 //var orderInfoList = customer.OrderInfo;
107 //while (orderInfoList.Count > 0)
108 //{
109 // var orderInfo = orderInfoList.FirstOrDefault();
110 // db.Entry<OrderInfo>(orderInfo).State = System.Data.EntityState.Deleted;
111 //}
112 //db.SaveChanges();
113
114 var orderList = from o in db.OrderInfo
115 where o.CustomerID == 2
116 select o;
117
118 }
119
120 }
121 }
三、第三种codeFirst模式,该模式是指不建立数据模型,并且不建立建立数据库的情况下,通过代码的形式去新建一个数据库。
1. :创建实体类,并且给实体加上特性标签,并且标注一下实体类之间的关系。
1.1创建classInfo(班级)实体类
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel.DataAnnotations;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace CodeFirstDemo
9 {
10 public class ClassInfo
11 {
12 [Key] //特性标签
13 public int Id { get; set; }
14 [StringLength(32)] //指定是字符串类型
15 [Required] //必填项
16 public string ClassName { get; set; }
17 [Required]
18 public DateTime CreateTime { get; set; }
19 //表示1对多,指一个班级对应多个学生
20 public virtual ICollection<StudentInfo> StudentInfo { get; set; }
21 }
22 }
1.2 :创建学生实体类
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel.DataAnnotations;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace CodeFirstDemo
9 {
10 public class StudentInfo
11 {
12 [Key]
13 public int Id { get; set; }
14 [StringLength(32)]
15 [Required]
16 public string StuName { get; set; }
17 [Required]
18 public DateTime SubTime { get; set; }
19 public virtual ClassInfo ClassInfo { get; set; } //表明外键关系,多对1
20 }
21 }
1.3. 引用Entity
方法1,点击引用,system.data.Entity
方法2. 新建一个数据模型,之后删掉,此时已经自动引用了entity
1.4 :创建codefirstdbcontext:dbcontext文件
1 using System;
2 using System.Collections.Generic;
3 using System.Data.Entity;
4 using System.Data.Entity.ModelConfiguration.Conventions;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8
9 namespace CodeFirstDemo
10 {
11 public class CodeFirstDbContext:DbContext
12 {
13 public CodeFirstDbContext()
14 : base("name=connStr") //对应连接数据库字符串的名字
15 {
16
17 }
18 protected override void OnModelCreating(DbModelBuilder modelBuilder)
19 {
20 //此代码的功能是移除复数的约定 就是指生成的表名后面不加S
21 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
22 }
23 //对应的表
24 public DbSet<ClassInfo> ClassInfo { get; set; }
25 public DbSet<StudentInfo> StudentInfo { get; set; }
26 }
27 }
1.5 :在配置文件构建数据库链接字符串。
1 <configSections>
2 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
3 </configSections>
1.6:查询部分数据以及实例创建代码


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class WebForm3 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 只查询其中几列数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
//使用HttpContext,只要持续调用,就一直都不会中断
EFFristModelEntities db = null;
if (HttpContext.Current.Items["db"] == null)
{
db = new EFFristModelEntities();
HttpContext.Current.Items["db"] = db;
}
else
{
db = HttpContext.Current.Items["db"] as EFFristModelEntities;
}
var userInfoList = from u in db.UserInfo
where u.ID == 343
select new{UName=u.UserName,UPwd=u.UserPass}; //新建一个匿名类查询
foreach (var userInfo in userInfoList)
{
Response.Write(userInfo.UName+":"+userInfo.UPwd);
}
}
/// <summary>
/// 匿名函数来查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
// Func<UserInfo, bool> whereLambda = u => { return u.ID == 343; };
EFFristModelEntities db = new EFFristModelEntities();
//var userInfoList = db.UserInfo.Where<UserInfo>(u=>u.ID==3);
//select * from UserInfo where id=343
//升序排序
//var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderBy<UserInfo, int>(u => u.ID);
//降序排序
//var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderByDescending(u => u.ID);
int pageIndex = 2;
int pageSize = 2;
var userInfoList = (from u in db.UserInfo
where u.ID > 0
orderby u.RegTime ascending, u.ID descending
select u).Skip<UserInfo>((pageIndex - 1) * pageSize).Take<UserInfo>(pageSize);
// var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderByDescending(u => u.UserPass).ThenByDescending<UserInfo, int>(u => u.ID);//Skip:表示跳过多少条记录, Take取多少条记录
foreach (var userInfo in userInfoList)
{
Response.Write(userInfo.UserName + "<br/>");
}
}
protected void Button3_Click(object sender, EventArgs e)
{
string str ="ttttt";
Response.Write (str.MyStr());
}
protected void Button4_Click(object sender, EventArgs e)
{
EFFristModelEntities db = new EFFristModelEntities();
var userInfoList = db.UserInfo.Where<UserInfo>(u => u.ID >0);
int i = 0;
int count = userInfoList.Count();
Response.Write(count);
}
}
}
以上就是EF创建和操作的详细介绍,欢迎评论和留言
org.apache.curator.framework.CuratorFramework的实例源码
org.apache.curator.framework.imps.CuratorFrameworkState的实例源码
/** * 在拉完全量后将此schema的kafka consumer的offset设置为最新 * @param dbSchema */ /*public void setKafkaOffsetToLargest(String targetTopic){ if(targetTopic==null) return; TopicPartition partition0 = new TopicPartition(targetTopic,0); KafkaConsumerContainer.getInstances().getConsumer(targetTopic).seekToEnd(Arrays.asList(partition0)); }*/ protected <T> T deserialize(String path,Class<T> clazz) throws Exception { T packet = null; CuratorFramework curator = CuratorContainer.getInstance().getCurator(); if (curator.getState() == CuratorFrameworkState.STOPPED) { LOG.info("[EventContainer] CuratorFrameworkState:{}",CuratorFrameworkState.STOPPED.name()); } else { byte[] bytes = curator.getData().forPath(path); if (bytes != null && bytes.length != 0) { packet = JsonUtil.fromJson(new String(bytes,Charset.forName("UTF-8")),clazz); } } return packet; }
/** * 初始化 * * @author zhangshaobin * @created 2013-6-26 上午10:55:30 */ private void init() { applicationName = DynamicPropertyFactory.getInstance().getStringProperty(CommonConstant.CONfig_APPLICATION_NAME_KEY,null).get(); String zkConfigEnsemble = DynamicPropertyFactory.getInstance().getStringProperty(CommonConstant.ZK_ENSEMABLE_KEY,null).get(); Integer zkConfigSessionTimeout = DynamicPropertyFactory.getInstance().getIntProperty(CommonConstant.ZK_SESSION_TIMEOUT_KEY,15000).get(); Integer zkConfigConnTimeout = DynamicPropertyFactory.getInstance().getIntProperty(CommonConstant.ZK_CONN_TIMEOUT_KEY,5000).get(); if (Check.NuNStr(zkConfigEnsemble)) { logger.warn("ZooKeeper configuration running in file mode,zk is not enabled since not configured"); return; } try { client = createAndStartZKClient(zkConfigEnsemble,zkConfigSessionTimeout,zkConfigConnTimeout); if (client.getState() != CuratorFrameworkState.STARTED) { throw new RuntimeException("ZooKeeper located at " + zkConfigEnsemble + " is not started."); } } catch (Exception e) { e.printstacktrace(); logger.error("连接配置中心服务器超时,时间5000毫秒。",e.getCause()); System.exit(1); } System.out.println(new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss] ").format(new Date()) + applicationName + " connected to cofnig server(" + zkConfigEnsemble + ")."); logger.info(applicationName + " connected to cofnig server(" + zkConfigEnsemble + ")."); }
@Override public void register(String service,String version,String address) { if(zkClient.getState() == CuratorFrameworkState.LATENT){ zkClient.start(); } if (version == null || version == ""){ version ="1.0.0"; } //创建临时节点 try { zkClient.create() .creatingParentsIfNeeded() .withMode(CreateMode.EPHEMERAL) .forPath("/"+service+"/"+version+"/"+address); } catch (Exception e) { logger.error("register service address to zookeeper exception:{}",e); throw new ThriftException("register service address to zookeeper exception:{}",e); } }
@Override public void register(String service,String address) { if(curatorFramework.getState() == CuratorFrameworkState.LATENT){ curatorFramework.start(); } if (version == null || version == ""){ version = ThriftConstant.DEFAULT_VERSION; } //创建临时节点 try { String path = "/"+service+"/"+version+"/"+address; logger.info("register: {}",path); curatorFramework.create() .creatingParentsIfNeeded() .withMode(CreateMode.EPHEMERAL_SEQUENTIAL) .forPath(path); } catch (Exception e) { logger.error("register service address to zookeeper exception:{}",e); } }
@Override public void relinquishleadership() { try { if (nodeCache != null) { nodeCache.close(); } LoggerHelper.info("node cache has been closed."); } catch (Throwable e) { LoggerHelper.warn("node cache close Failed.",e); } if (client.getState() == CuratorFrameworkState.STARTED) { MasterSlaveNodeData.Data nodeData = new MasterSlaveNodeData.Data(getNodeIp()); releaseJobs(nodePath,nodeData); nodeData.setNodeState("Slave"); masterSlaveApiFactory.nodeApi().updateNode(nodePath,nodeData); } LoggerHelper.info("clear node successfully."); }
@Override public void relinquishleadership() { try { if (jobcache != null) { jobcache.close(); } LoggerHelper.info("job cache has been closed."); } catch (Throwable e) { LoggerHelper.warn("job cache close Failed.",e); } LoggerHelper.info("begin stop scheduler manager."); schedulerManager.shutdown(); if (client.getState() == CuratorFrameworkState.STARTED) { StandbyNodeData.Data data = new StandbyNodeData.Data(getNodeIp()); standbyApiFactory.nodeApi().updateNode(nodePath,data); LoggerHelper.info(getNodeIp() + " has been shutdown. [" + data + "]"); } LoggerHelper.info("clear node successfully."); }
public void save(SingularityHostState hostState) throws InterruptedException { final String path = ZKPaths.makePath(ROOT_PATH,hostState.getHostname()); final byte[] data = hostStateTranscoder.toBytes(hostState); if (curator.getState() == CuratorFrameworkState.STARTED) { try { if (exists(path)) { curator.setData().forPath(path,data); } else { curator.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path,data); } } catch (Throwable t) { throw Throwables.propagate(t); } } }
/** * Test the timeout exception * * @throws IOException * @throws InterruptedException */ @Test public void testConnect() throws IOException,InterruptedException { // we expect a ConnectException to be thrown final ZConnection conn = new ZConnection("localhost:" + server.getPort(),10000L); try { CuratorFramework zk = conn.get(); assertTrue(zk.getState().compareto(CuratorFrameworkState.STARTED) == 0); } finally { conn.close(); } }
private Servicediscovery<ZookeeperInstance> buildServicediscoveryWith(ZookeeperConfiguration configuration,CuratorFramework curator,InstanceSerializer<ZookeeperInstance> serializer) { try { if (!CuratorFrameworkState.STARTED.equals(curator.getState())) { curator.start(); } Servicediscovery<ZookeeperInstance> servicediscovery = ServicediscoveryBuilder.builder(ZookeeperInstance.class) .client(curator) .basePath(configuration.root()) .serializer(serializer) .build(); servicediscovery.start(); return servicediscovery; } catch (Exception e) { throw new ZookeeperServicediscoveryException("Error on create Zookeeper Servicediscovery",e); } }
@Override public WaitResult wait(DockerFacade dockerClient,Container container) { return new PortWait().wait(ZOOKEEPER_PORT,dockerClient,container,(ipAddress,externalPort) -> { String zookeeperConnectionString = String.format("%s:%s",ipAddress,externalPort); RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperConnectionString,retryPolicy); client.start(); try { client.blockUntilConnected(); CuratorFrameworkState status = client.getState(); if (!status.equals(CuratorFrameworkState.STARTED)) { return WaitResult.failure("Status [%s] does not match expected [STARTED]",status); } return WaitResult.success(); } catch (InterruptedException e) { throw new RuntimeException("Could not connect to Zookeeper",e); } finally { client.close(); } }); }
private synchronized ZMapping readCurrentMapping(Stat stat) { ZMapping zMap = null; try { if (client.getState().equals(CuratorFrameworkState.STOPPED)) { LOG.warn("Attempting to read state on stopped client."); return null; } byte[] data = client.getData().storingStatIn(stat).usingWatcher(new CuratorWatcher() { @Override public void process(WatchedEvent watchedEvent) throws Exception { ZMapping newMapping = readCurrentMapping(); if (newMapping == null && mapping != null) { LOG.warn("An attempt was made to overwrite current mapping with a null one."); } else { mapping = newMapping; } LOG.debug("Host {} just updated its mapping to version {}",hostPort,(mapping != null) ? mapping.getVersion() : -1); } }).forPath(MAPPING_PATH); zMap = ZMapping.deserialize(data); } catch (Exception e) { LOG.error("Error reading current mapping: ",e); } return zMap; }
@Override protected void doHealthCheck(Health.Builder builder) throws Exception { try { if (this.curator.getState() != CuratorFrameworkState.STARTED) { builder.down().withDetail("error","Client not started"); } else if (this.curator.checkExists().forPath("/") == null) { builder.down().withDetail("error","Root for namespace does not exist"); } else { builder.up(); } builder.withDetail("connectionString",this.curator.getZookeeperClient().getCurrentConnectionString()) .withDetail("state",this.curator.getState()); } catch (Exception e) { builder.down(e); } }
private ZKUtils(String zookeeperCluster,String groupId) throws Exception { this.groupId = groupId; // ZOOKEPER CONNECTION client = CuratorFrameworkFactory.newClient(zookeeperCluster,25 * 1000,10 * 1000,new ExponentialBackoffRetry( 1000,3)); client.start(); client.getZookeeperClient().blockUntilConnectedOrTimedOut(); if (client.getState().compareto(CuratorFrameworkState.STARTED) != 0) { throw new Exception("Connection to Zookeeper timed out after seconds"); } else { backgroundZookeeperCleanerTasks = Executors.newFixedThreadPool(1); backgroundZookeeperCleanerTasks.submit(new ZookeeperBackgroundCleaner(client,groupId)); } }
@SuppressWarnings("unchecked") @Test public void testStart() throws Exception { CuratorFramework framework = mockFramework(); ExistsBuilder ceBuilder = mock(ExistsBuilder.class); CreateBuilder createBuilder = mock(CreateBuilder.class); when(framework.checkExists()).thenReturn(ceBuilder); when(ceBuilder.forPath("/services/myservice/nodes")).thenReturn(mock(Stat.class)); when(framework.create()).thenReturn(createBuilder); when(framework.getState()).thenReturn(CuratorFrameworkState.STARTED); ACLBackgroundpathAndBytesable<String> os = mock(ACLBackgroundpathAndBytesable.class); when(createBuilder.withMode(CreateMode.EPHEMERAL)).thenReturn(os); discoService service = new discoService(framework,"myservice"); byte[] payload = "foo bar baz bingo".getBytes(); service.start("foo",4321,true,payload); verify(os).forPath(eq("/services/myservice/nodes/foo:4321"),eq(payload)); }
@SuppressWarnings("unchecked") @Test public void testDeletesEphemeralNode() throws Exception { CuratorFramework framework = mockFramework(); ExistsBuilder ceBuilder = mock(ExistsBuilder.class); CreateBuilder createBuilder = mock(CreateBuilder.class); when(framework.checkExists()).thenReturn(ceBuilder); when(ceBuilder.forPath("/services/myservice/nodes")).thenReturn(mock(Stat.class)); when(ceBuilder.forPath("/services/myservice/nodes/foo:4321")).thenReturn(mock(Stat.class)); when(framework.create()).thenReturn(createBuilder); when(framework.getState()).thenReturn(CuratorFrameworkState.STARTED); DeleteBuilder deleteBuilder = mock(DeleteBuilder.class); when(framework.delete()).thenReturn(deleteBuilder); ACLBackgroundpathAndBytesable<String> os = mock(ACLBackgroundpathAndBytesable.class); when(createBuilder.withMode(CreateMode.EPHEMERAL)).thenReturn(os); discoService service = new discoService(framework,payload); verify(deleteBuilder).forPath("/services/myservice/nodes/foo:4321"); verify(os).forPath(eq("/services/myservice/nodes/foo:4321"),eq(payload)); }
/** * Start the registration of the {@link #candidate} for leader election. */ @Override public synchronized void start() { if (!this.running) { if (this.client.getState() != CuratorFrameworkState.STARTED) { // we want to do curator start here because it needs to // be started before leader selector and it gets a little // complicated to control ordering via beans so that // curator is fully started. this.client.start(); } this.leaderSelector = new leaderSelector(this.client,buildleaderPath(),new leaderListener()); this.leaderSelector.setId(this.candidate.getId()); this.leaderSelector.autoRequeue(); this.leaderSelector.start(); this.running = true; } }
@Test public void testNewManagedCurator() { ZooKeeperConfiguration config = parse(ImmutableMap.of("retryPolicy",ImmutableMap.builder() .put("type","untilElapsed") .put("maxelapsedtimeMs",1000) .put("sleepMsBetweenRetries",50) .build())); LifecycleEnvironment env = mock(LifecycleEnvironment.class); CuratorFramework curator = config.newManagedCurator(env); assertNotNull(curator); assertEquals(CuratorFrameworkState.LATENT,curator.getState()); verify(env).manage(any(ManagedCuratorFramework.class)); }
/** * Create the ephemeral node in ZooKeeper. If the node cannot be created in a timely fashion then an exception will * be thrown. */ public PersistentEphemeralNode(CuratorFramework curator,String basePath,byte[] data,CreateMode mode) { checkNotNull(curator); checkArgument(curator.getState() == CuratorFrameworkState.STARTED); checkNotNull(basePath); checkNotNull(data); checkNotNull(mode); checkArgument(mode == CreateMode.EPHEMERAL || mode == CreateMode.EPHEMERAL_SEQUENTIAL); // Todo: Share this executor across multiple persistent ephemeral nodes in a way that guarantees that it is a // Todo: single thread executor. _executor = Executors.newSingleThreadScheduledExecutor(THREAD_FACTORY); _async = new Async(_executor,new Sync(curator,basePath,data,mode)); CountDownLatch latch = new CountDownLatch(1); _async.createNode(latch); await(latch,CREATION_WAIT_IN_SECONDS,TimeUnit.SECONDS); }
/** * Creates an instance of {@code ZooKeeperNodediscovery}. * * @param curator Curator framework reference. * @param nodePath The path in ZooKeeper to watch. * @param parser The strategy to convert from ZooKeeper {@code byte[]} to {@code T}. */ public Nodediscovery(CuratorFramework curator,String nodePath,NodeDataParser<T> parser) { checkNotNull(curator); checkNotNull(nodePath); checkNotNull(parser); checkArgument(curator.getState() == CuratorFrameworkState.STARTED); checkArgument(!"".equals(nodePath)); ThreadFactory threadFactory = new ThreadFactoryBuilder() .setNameFormat(getClass().getSimpleName() + "(" + nodePath + ")-%d") .setDaemon(true) .build(); _nodes = Maps.newConcurrentMap(); _listeners = Sets.newSetFromMap(Maps.<NodeListener<T>,Boolean>newConcurrentMap()); _curator = curator; _executor = Executors.newSingleThreadScheduledExecutor(threadFactory); _pathCache = new PathChildrenCache(curator,nodePath,false,_executor); _nodeDataParser = parser; _closed = false; }
public void save(SingularityHostState hostState) throws InterruptedException { final String path = ZKPaths.makePath(ROOT_PATH,data); } } catch (Throwable t) { throw Throwables.propagate(t); } } }
/** * Check whether this KijiClient is healthy. * * @return health status of the KijiClient. */ public HealthCheck.Result checkHealth() { final State state = mState.get(); Preconditions.checkState(state == State.STARTED,"Can not check health while in state %s.",state); List<String> issues = Lists.newArrayList(); if (mZKFramework.getState() != CuratorFrameworkState.STARTED) { issues.add(String.format("ZooKeeper connection in unhealthy state %s.",mZKFramework.getState())); } for (KijiInstanceCache instanceCache : mInstanceCaches.asMap().values()) { issues.addAll(instanceCache.checkHealth()); } if (issues.isEmpty()) { return HealthCheck.Result.healthy(); } else { return HealthCheck.Result.unhealthy(Joiner.on('\n').join(issues)); } }
@Override public void start() throws Exception { if (!isstarted.compareAndSet(false,true)) { throw new RuntimeException("Service already started!"); } if (framework.getState() != CuratorFrameworkState.STARTED) { throw new RuntimeException("CuratorFramework is not started!"); } nodeCache.getListenable().addListener(new NodeCacheListener() { @Override public void nodeChanged() throws Exception { build(); } }); nodeCache.start(true); build(); }
public synchronized void stop() throws Exception { if (started) { server.stop(); serverThread.join(); if (gcTsTracker != null) { gcTsTracker.stop(); } started = false; currentleader = null; if (curatorFramework.getState().equals(CuratorFrameworkState.STARTED)) { pathChildrenCache.getListenable().removeListener(this); pathChildrenCache.close(); leaderSelector.close(); curatorFramework.getConnectionStateListenable().removeListener(this); curatorFramework.close(); } log.info("Oracle server has been stopped."); } }
/** * 创建Zookeeper连接 * * @throws InterruptedException * @throws UnsupportedEncodingException */ @postconstruct public void connect() throws InterruptedException,UnsupportedEncodingException { client = CuratorFrameworkFactory.builder() .connectString(connectString) .retryPolicy(new ExponentialBackoffRetry(DEFAULT_BASE_SLEEP_TIME_MS,DEFAULT_MAX_RETRIES)) .namespace(DEFAULT_NAMESPACE) .authorization(DEFAULT_ACL_SCHEME,DEFAULT_ACL_AUTH.getBytes(DEFAULT_CHARSET)) // 设置权限 .aclProvider(new ACLProvider() { // 设置ACL规则 @Override public List<ACL> getDefaultAcl() { return DEFAULT_ACL_LIST; } @Override public List<ACL> getAclForPath(String path) { return DEFAULT_ACL_LIST; } }) .build(); if (CuratorFrameworkState.STARTED != client.getState()) { client.start(); } while (!client.blockUntilConnected(MAX_WAIT_SECONDS,TimeUnit.SECONDS)) { log.info("can not connect to zookeeper,retry again!!"); } }
protected <T> T deserialize(String path,Class<T> clazz) throws Exception { T packet = null; CuratorFramework curator = CuratorContainer.getInstance().getCurator(); if (curator.getState() == CuratorFrameworkState.STOPPED) { LOG.info("[control-event] CuratorFrameworkState:{}",clazz); } } return packet; }
protected void saveZk(String node,String packet) { try { CuratorFramework curator = CuratorContainer.getInstance().getCurator(); if (curator.getState() == CuratorFrameworkState.STOPPED) { LOG.info("[control-event] CuratorFrameworkState:{}",CuratorFrameworkState.STOPPED.name()); } else { curator.setData().forPath(node,packet.getBytes()); } } catch (Exception e) { LOG.error("[control-event] 报错znode: " + node + ",数据包:" + packet + "失败!",e); } }
protected void saveZk(String node,String packet) { try { CuratorFramework curator = CuratorContainer.getInstance().getCurator(); if (curator.getState() == CuratorFrameworkState.STOPPED) { LOG.info("[EventContainer] CuratorFrameworkState:{}",e); } }
/** * 关闭注册 */ @Override public synchronized void logout() { CuratorFramework client = (CuratorFramework) regCenter.getRawClient(); if (client.getState() == CuratorFrameworkState.STARTED) { // 移除注册节点 regCenter.remove(nodePath.getWorkerIdpath()); // 关闭连接 regCenter.close(); } }
/** * 初始化zk连接 * * @author zhangshaobin * @created 2013-6-26 上午10:21:34 */ private void init() { applicationName = DynamicPropertyFactory.getInstance().getStringProperty(CommonConstant.CONfig_APPLICATION_NAME_KEY,5000).get(); Transaction tran = Cat.newTransaction("Asura Configuration init",applicationName + "_" + zkConfigEnsemble); try { if (Check.NuNStr(zkConfigEnsemble)) { logger.warn("ZooKeeper configuration running in file mode,zk is not enabled since not configured"); Cat.logError("zk is not enabled since not configured",new RuntimeException("ZooKeeper located at " + zkConfigEnsemble + " is not started.")); return; } client = createAndStartZKClient(zkConfigEnsemble,zkConfigConnTimeout); if (client.getState() != CuratorFrameworkState.STARTED) { throw new RuntimeException("ZooKeeper located at " + zkConfigEnsemble + " is not started."); } tran.setStatus(Transaction.SUCCESS); } catch (Exception e) { logger.error("连接配置中心服务器超时,时间5000毫秒。",e); Cat.logError("asura configuration init exception",e); tran.setStatus(e); System.exit(1); } finally { tran.complete(); } logger.info(new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss] ").format(new Date()) + applicationName + " connected to cofnig server(" + zkConfigEnsemble + ")."); logger.info(applicationName + " connected to cofnig server(" + zkConfigEnsemble + ")."); }
/** * Quick check to ensure that Curator has been started. */ private void ensureCuratorHasstarted() { // If our client isn't started yet if (CuratorFrameworkState.STARTED != curator.getState()) { // Lets start it! logger.debug("Curator not started,starting it Now!"); curator.start(); } }
void closeCurator() { if (curatorFramework.getState() == CuratorFrameworkState.STARTED) { log.info("Closing curator"); curatorFramework.close(); } dataStoreSupport.shutdown(); }
protected void setupClient() { client = mock(CuratorFramework.class); existsBuilder = mock(ExistsBuilder.class); pathCreator = mock(ZookeeperConnector.IPathCreator.class); stackCache = mock(IStacksCache.class); nodeCacheFactory = mock(INodeCacheFactory.class); pathChildrenCacheFactory = mock(IPathChildrenCacheFactory.class); when(client.checkExists()).thenReturn(existsBuilder); when(client.getState()).thenReturn(CuratorFrameworkState.STARTED); }
@Test public void testGetCurator() throws Exception { final TestingServer zk = new TestingServer(true); final TrellisConfiguration config = new YamlConfigurationFactory<>(TrellisConfiguration.class,Validators.newValidator(),Jackson.newObjectMapper(),"") .build(new File(getClass().getResource("/config1.yml").toURI())); config.getZookeeper().setEnsembleServers(zk.getConnectString()); final CuratorFramework curator = TrellisUtils.getCuratorClient(config); assertEquals(CuratorFrameworkState.STARTED,curator.getState()); }
@Test public void garbaged_map_should_close_curator_client() throws NamingException { withServer(srv -> { final CuratorFramework client = ZooMap.Periscope.client(ZooMap.newMap(srv.getConnectString())); System.gc(); await().atMost(5,TimeUnit.SECONDS).until(client::getState,is(CuratorFrameworkState.STOPPED)); }); }
@Override public void afterPropertiesSet() throws Exception { // 如果zk尚未启动,则启动 if (zkClient.getState() == CuratorFrameworkState.LATENT) { zkClient.start(); } buildpathChildrenCache(zkClient,getServicePath(),true); cachedpath.start(StartMode.POST_INITIALIZED_EVENT); countDownLatch.await(); }
/** * Getting the curator oject to start the zookeeper connection estabished * * @param curator * @return curator object */ public static CuratorFramework getCuratorFramework(CuratorFramework curator) { if (curator.getState() == CuratorFrameworkState.LATENT) { curator.start(); try { curator.blockUntilConnected(); } catch (InterruptedException e) { // Ignore log.error("error while setting curator framework :" + e.getMessage()); } } return curator; }
public static CuratorFramework getClient(String registerUrl) { if (registerHolder == null) { synchronized (RegisterHolder.class) { if (registerHolder == null) { registerHolder = new RegisterHolder(); curatorMap = Maps.newHashMap(); lock = new reentrantlock(); } } } CuratorFramework client = null; lock.lock(); try { String tempurl = registerUrl.trim(); if (!curatorMap.containsKey(tempurl)) { ZkClientFactory zookeeperClientFactory = new ZkClientFactory().setAllAndGetClientFactory(tempurl); client = zookeeperClientFactory.newCuratorFramework(); CuratorFrameworkState state = client.getState(); if (state != CuratorFrameworkState.STARTED) { client.start(); } curatorMap.put(tempurl,client); } else { client = curatorMap.get(tempurl); } } finally { lock.unlock(); } return client; }
public ClusterZKImpl(CuratorFramework zkClient,String clusterName) { this.client = zkClient; this.clusterName = clusterName; if (client.getState().equals(CuratorFrameworkState.LATENT)) { client.start(); } }
@Test public void testStart() throws InterruptedException { String zookeeperConnectionString = zookeeper.format("%HOST%:%EPORT%",2181); RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperConnectionString,retryPolicy); client.start(); client.blockUntilConnected(); assertthat(client.getState(),is(CuratorFrameworkState.STARTED)); client.close(); }
public DynamicConfigZKAdapter(final Class<T> clazz,final String path,final CuratorFramework curatorFramework,Converter<T,byte[]> converter,changelistener<T> changelistener) throws Exception { super(clazz,converter,Optional.fromNullable(changelistener)); Preconditions.checkNotNull(curatorFramework,"CuratorFramework cannot be null"); Preconditions.checkArgument(curatorFramework.getState() == CuratorFrameworkState.STARTED,"CuratorFramework must be started"); Preconditions.checkArgument(path != null && !path.isEmpty(),"path cannot be null or blank"); this.curatorFramework = curatorFramework; this.path = path; this.nodeCache = new NodeCache(curatorFramework,path); }
今天关于TeaFramework——ORM框架的实现和一的分享就到这里,希望大家有所收获,若想了解更多关于.Net Framework 4.7或仅.Net Framework 2.0上的Winforms是否兼容Mono?、Entity Framework框架 (一)、org.apache.curator.framework.CuratorFramework的实例源码、org.apache.curator.framework.imps.CuratorFrameworkState的实例源码等相关知识,可以在本站进行查询。
本文标签: