我对java编程很陌生,我正在使用数据库创建一个简单的银行管理系统。我需要创建具有9位数的帐号的用户帐户,而不是以0开头。此外,所有的帐号必须是不同的(一个帐号可以有重复数字)。每次我运行这个程序时,它都会给我一个9位数的数字,而不是存储在“account_number”下的“login_info”数据库下的“accounts”表中。
程序是这样运行的,
H 210H 111当用户进入银行帐户信息选项卡时必须生成帐户号。用户无法更改帐号。(帐号必须是以前没有保存在数据库中的帐号)这是stuck这个程序运行得很好,但我似乎无法生成一个独特的银行帐号。其他步骤已经完成。
(这不是针对任何商业产品,只是为了让我熟悉java数据库处理的项目。)
知道怎么做吗?
谢谢。
发布于 2022-07-14 17:54:04
下面是你可以采取的一种方法,详细阐述我在上面发表的评论:
预先计算所有有效帐号有3,265,920个有效组合(第一位数为1-9,
h 19 so:9*9*8*7*6*5*4*3*2 )。
table
开始。
在Java应用程序中,当您想向用户提供候选帐户号时,可以使用数据库将一行从“无人认领”更新到“挂起”,并返回该帐户号--因此,即使多个调用方同时尝试设置一个新帐户,数据库也会强制执行正确性。类似于:“更新status=unclaimed设置status=pending限制1的帐户”,并返回更新的行。
从那里:
。
这种方法将允许您在创建所有初始无人认领帐户时,只需预先执行一次数字详细说明。它确实有一个潜在的缺点,那就是你有300万行未使用,但总体上来说很简单--不用担心进一步的组合,或者生成一个数字,然后让数据库来查看这个数字是否被要求(以及重新生成是否使用数字),或者在数据库中进行任何类型的扫描,作为数字选择过程的输入,或者其他人们可能想出的想法。先把工作做好。
发布于 2022-07-14 15:28:18
如果希望该数字是随机的,请创建一个从0到899 999 999的数字,然后添加100 000 000 (因此第一个数字永远不会是0)。如果这些数字存储在Arraylist中(在本例中称为num),下面的代码应该会有所帮助:
int num;
Do{
num = (int)(Math.random()*800000000)+100000000;
}while (nums.contains(num));
nums.add(num);发布于 2022-07-14 20:02:42
我正在使用数据库创建一个简单的银行管理系统。我需要创建具有9位数的帐号的用户帐户,而不是以0开头。此外,所有的帐号必须是不同的。每次我运行这个程序时,它都会给我一个9位数的数字,而不是存储在“account_number”下的“login_info”数据库下的“accounts”表中。
这实际上是一个出乎意料的复杂问题。最好的答案取决于你没有提到的其他因素:
的数据库。
如果第一个项目回答是“每次运行程序”,那么您需要考虑帐户号种子(用于生成下一个可用帐户号的数量或数量)是如何从run持久化到运行的(否则当JVM退出时,种子就会被销毁)。
如果第二个项目是“多个线程”,那么您需要考虑如何防止无意中同时向请求一个的线程提供相同的帐号。
剩下的子弹处理身份。帐号通常用于标识系统的特定帐户(但不一定)。因此,您必须考虑身份何时需要对系统可用。您还必须考虑哪个系统负责管理身份。如果在创建帐户实体时就需要标识,则需要在Java实例化帐户期间获得标识。如果在帐户实体被持久化到数据库之前不需要它,那么数据库系统可能会创建标识。
混合解决方案是在帐户被实例化后立即持久化它,然后再次读取它以获得帐户号(代价是增加数据库流量)。如果帐户最终不需要持久化,则可能需要逻辑来删除数据库记录(例如,因为它已被取消)。
根据这些问题的答案,以及其他重要因素,如可用性、可扩展性、冗余性、安全性等,原始问题的完整解决方案可能会变得任意复杂。
但是,如果我们假设帐户号只需要在Java系统的相同运行过程中是唯一的,并且帐户访问仅是单线程的,那么解决方案可能变得非常简单:
public static class AccountNumberManager {
private static long accountNumberSeed = getStartupSeedValue();
private AccountNumberManager() { }
public long getNextAccountNumber() {
return ++accountNumberSeed;
}
private static long getStartupSeedValue() {
return 100000000L;
}
}一些简短的说明:
static类使帐户号种子值线程的初始化安全。当类加载程序在加载过程中锁定类时发生初始值初始化,因此线程安全(类及其静态字段只能初始化一次和一次)。这是静态holder类初始化方法。如果系统演变成并发的environment.,这将非常方便。
当然,
https://stackoverflow.com/questions/72982645
复制相似问题