账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    GUID为什么会重复了,是代码有问题吗?
    56
    0

    根据我在网上查到资料,表示GUID重复几率很小,但是我这边项目最近一启动,没过多长时间就会有重复的GUID生成,是我代码上面写的有问题吗?

    具体代码如下:

    public class AccountTaskExecutorTask extends TimerTask {
        private static final Logger logger = Logger.getLogger(AccountTaskExecutorTask.class);
        private TellerDbCore.AccountTask.Builder aTask = null;
    
        public AccountTaskExecutorTask(TellerDbCore.AccountTask.Builder aTask) {
            this.aTask = aTask;
        }
    
        public static void schedule(TellerDbCore.AccountTask.Builder aTask) {
            Timer timer = new Timer();
            timer.schedule(new AccountTaskExecutorTask(aTask), 100L);
        }
    
        @Override
        public void run() {
            try {
                process(aTask);
            } catch (Exception e) {
                logger.error("", e);
            }
        }
    
        public static void process(TellerDbCore.AccountTask.Builder aTask) {
            DataBaseStore dataBaseStore = null;
            try {
                    dataBaseStore = DbHelper.getTransactableDbStore();
                    invest(aTask, dataBaseStore);
                    dataBaseStore.commitAndClose();
                    dataBaseStore = null;
                } catch (Exception e) {
                    logger.error("", e);
                    if (dataBaseStore != null) {
                        dataBaseStore.rollbackAndClose();
                        dataBaseStore = null;
                    }
                }
        }
    
    
        private static void invest(TellerDbCore.AccountTask.Builder theTask, DataBaseStore dataBaseStore) throws Exception {
            if (theTask.getProductType() == BtsDbBase.ProductType.PT_NONE_LOCK
                    || theTask.getProductType() == BtsDbBase.ProductType.PT_LOCK_3
                    || theTask.getProductType() == BtsDbBase.ProductType.PT_LOCK_7) {
                switch (theTask.getTaskStatus()) {
                    case TS_READY:
                        List<TellerDbCore.AccountSubTask.Builder> subList = AccountTaskHelper.querySubAtByMtId(theTask.getTaskId(), dataBaseStore);
                        if (subList.size() == 0) {
                            NewMethods.newAccountSubTask(theTask.getTaskId(), GUID.generateGUID().toLowerCase(),
                                    theTask.getAccountId(), theTask.getProductType(), theTask.getTaskType(), theTask.getAmount(), dataBaseStore);
                        }
                        UpdateMethods.updateAccountTask(theTask.getTaskId(), null, BtsDbBase.TaskStatus.TS_PROCESSING, dataBaseStore);
                        break;
                    case TS_PROCESSING:
                        List<TellerDbCore.AccountSubTask.Builder> subTaskList = AccountTaskHelper.querySubAtByMtId(theTask.getTaskId(), dataBaseStore);
                        if (subTaskList.size() == 1) {
                            TellerDbCore.AccountSubTask.Builder aSubTask = subTaskList.get(0);
                            VirtualDbBase.TaskStatus vTs = VirtualConnector.queryTaskStatus(aSubTask.getVrNo(), null);
                            if (vTs == null) {
                                VirtualConnector.submitTask(theTask.getAccountId(), BizConstant.VIRTUAL_SYS_INTERMEDIARY,
                                        aSubTask.getAmount() / 100, aSubTask.getVrNo(), VirtualDbBase.TransferType.TT_INVEST,
                                        theTask.getRequestNo());
                            } 
                        } else {
                            throw new RuntimeException(ErrCode.SYSTEM_ERROR);
                        }
                        break;
                    case TS_SUCCESSED:
                    case TS_FAILED:
                        break;
                    default:
                        logger.info( theTask.getTaskStatus());
                        break;
                }
            }
        }
    }
    

    这段代码里面是通过GUID.generateGUID().toLowerCase()来生成GUID,它是oscore-2.2.4.jar包下的类方法。

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 金牛座守护神 普通会员 1楼

      在编程中,Guid(全局标识符)是一种特殊的标识符,它由十六进制字符和一个或多个小写字母和数字组成,用于在程序中唯一标识一组数据。在编程语言中,Guid的设计目的是为了提高程序的可读性和安全性,因为它们可以被计算机识别并唯一标识特定的内存地址,从而避免同一块内存地址被多次访问或赋值,防止数据的不一致性和安全性问题。

      Guid的重复问题可能有以下几种情况:

      1. 在循环中: 如果在循环中使用Guid作为标识符,由于每次循环的标识符是唯一的,所以可能会出现Guid重复的情况。例如:

      python for i in range(10): id = Guid(i) print(id)

      在这种情况下,Guid会在每次循环迭代时生成一个唯一的值,因此每次打印都会看到不同的Guid。

      1. 在全局函数中: 如果在全局函数中使用Guid作为标识符,由于函数是全局的,所以可能会导致Guid重复。例如:

      python def global_func(): id = Guid("global_function_id") print(id)

      在这种情况下,Guid将在函数内部生成一个唯一的值,然后在函数外部调用时打印出该值,所以无论函数被调用多少次,都会看到不同的Guid。

      1. 在类或对象中: 如果在类或对象中使用Guid作为标识符,Guid的值在类或对象的实例初始化或创建时会自动生成,从而避免Guid的重复。例如:

      ```python class MyClass: def init(self, guid): self.guid = guid

      def get_guid(self):
          return self.guid
      
      def set_guid(self, new_guid):
          self.guid = new_guid
      
      def __str__(self):
          return f"MyClass({self.guid})"
      

      my_object = MyClass(Guid("unique-guid")) print(my_object.get_guid()) # 输出: MyClass(unique-guid) print(my_object.set_guid("new-guid")) # 输出: MyClass(unique-guid, new-guid) print(my_object.get_guid()) # 输出: MyClass(unique-guid) ```

      在这种情况下,Guid在类或对象的实例初始化或创建时会被自动生成,所以即使类或对象被创建多次,Guid也不会重复。

      1. 在全局变量中: 如果在全局变量中使用Guid作为标识符,Guid的值在变量被初始化或赋值时会自动生成,从而避免Guid的重复。例如:

      ```python def global_func(): global Guid Guid = Guid("global_func_guid")

      # 假设global_func()调用多次,Guid的值也会被自动更新
      print(Guid)
      

      global_func() ```

      在这种情况下,Guid在全局函数的调用中被自动生成,即使global_func()调用多次,Guid的值也不会重复。

      综上所述,Guid的重复问题可能有多种情况,包括在循环、全局函数、类或对象、全局变量等场合。在编写代码时,应尽量避免使用Guid作为标识符,如果需要,应确保Guid的值在每次使用时都具有唯一性,并确保Guid在不同使用场景下的值是自动更新的。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部