开发者社区 问答 正文

JFinal synchronized 同步问题 400 请求报错 

需求Web请求,生成序列号(每天初始化0),是在Controller的方法上加synchronized,还是在Model的方法上加synchronized,能排队执行。
Model里调用Mysql 函数,直接返回计算后的序列号。

展开
收起
kun坤 2020-05-30 15:08:33 693 分享 版权
1 条回答
写回答
取消 提交回答
  • 引用来自“JFinal”的评论

        Controller 不是单例的,所以如果在 Controller 上做除了要添加synchronized 以外,还需要添加 static,Model 同样也要注意这个问题。     再建议一个方法: 1:创建一个表,假定叫 serial_gen,创建一个自增字段,假定叫 n,并设置这个 n 为主键 2:创建一个相应的 Model,假定叫 SerialGen---> class SerialGen extends Model<SerialGen>{} 3:通过如下的方法获取序号:
    SerialGen sg = new SerialGen();
    sg.save();
    int result = sg.getInt("n");
       上面的代码会生成一个 instert into 语句自动创建一条数据库记录,并且立即返回其主键 n 的值,而这个 n 被设置为自增。由于次生成时每个线程都是调用的 insert into,这些线程拿到的 n 值也是本线程创建的,正好可以满足你的需求。 4:做个定时器,每天早上零点零分零秒自动清零一次,第二天又会从零开始,记得要用这个 sql:Db.update("truncate table serial_gen") 才可以

    引用来自“没想好”的评论

    Controller renderJson不是 static,如何解??? Controller  对于每一个线程都是单独的对象,是线程安全的,所以在 jfinal 这边不存在同步的问题,前面讲的使用 static synchronized 是我猜测你自己的代码区域需要同步,如果你自己的代码区域也不存在线程安全问题,放心使用 controller 即可,根本不用添加 synchronized######OK,区域需要同步######     Controller 不是单例的,所以如果在 Controller 上做除了要添加synchronized 以外,还需要添加 static,Model 同样也要注意这个问题。     再建议一个方法: 1:创建一个表,假定叫 serial_gen,创建一个自增字段,假定叫 n,并设置这个 n 为主键 2:创建一个相应的 Model,假定叫 SerialGen---> class SerialGen extends Model<SerialGen>{} 3:通过如下的方法获取序号:
    SerialGen sg = new SerialGen();
    sg.save();
    int result = sg.getInt("n");
       上面的代码会生成一个 instert into 语句自动创建一条数据库记录,并且立即返回其主键 n 的值,而这个 n 被设置为自增。由于次生成时每个线程都是调用的 insert into,这些线程拿到的 n 值也是本线程创建的,正好可以满足你的需求。 4:做个定时器,每天早上零点零分零秒自动清零一次,第二天又会从零开始,记得要用这个 sql:Db.update("truncate table serial_gen") 才可以 ######多谢,之前是控制不住,才使用mysql自定义函数控制。这是个好方法######

    引用来自“JFinal”的评论

        Controller 不是单例的,所以如果在 Controller 上做除了要添加synchronized 以外,还需要添加 static,Model 同样也要注意这个问题。     再建议一个方法: 1:创建一个表,假定叫 serial_gen,创建一个自增字段,假定叫 n,并设置这个 n 为主键 2:创建一个相应的 Model,假定叫 SerialGen---> class SerialGen extends Model<SerialGen>{} 3:通过如下的方法获取序号:
    SerialGen sg = new SerialGen();
    sg.save();
    int result = sg.getInt("n");
       上面的代码会生成一个 instert into 语句自动创建一条数据库记录,并且立即返回其主键 n 的值,而这个 n 被设置为自增。由于次生成时每个线程都是调用的 insert into,这些线程拿到的 n 值也是本线程创建的,正好可以满足你的需求。 4:做个定时器,每天早上零点零分零秒自动清零一次,第二天又会从零开始,记得要用这个 sql:Db.update("truncate table serial_gen") 才可以 Controller renderJson不是 static,如何解??? ######renderJson不是static的 由this调用
    2020-05-30 15:08:39
    赞同 展开评论