面试问题
比如说,我们有一个在Employee表中有200万条记录的表,我们需要削减每个员工10%的工资(需要做一些处理),然后将其保存回collection。你怎样才能有效地做到这一点。
我问他,我们可以使用executor框架来创建多个线程,这些线程可以从表中获取值,然后我们可以处理并将其保存到列表中。
然后他问我,你将如何检查一个记录是否已经被处理,我不知道(如何做)。
甚至我也不确定我是否擅长自己的方法。
请帮忙。
我将加载该表,然后为状态添加一列。默认情况下,您可以将该列设置为“未处理”。一旦线程开始处理该员工,它将把状态更改为“正在处理”,然后当完成时,它最终将其切换为“已处理”。
有3个这样的状态也允许您将其用作锁,以防止处理发生两次。
如上所述,给出问题的最佳方法是使用纯SQL,类似于:
update employees set
salary = salary * .9
很难想象需要对SQL无法处理的员工数据做些什么。
如果由于一些糟糕的设计,你真的需要对员工类型数据做一些SQL绝对不能做的事情,那么你会打开一个游标到行集并迭代它,同步更新,这样你就只对数据做一次传递。
在伪代码中:
cursor = forUpdate ("select for update * from employees")
while (cursor.next()) {
cursor.salary = cursor.salary * .9
}
这是最简单、最快的执行方法。
—-
它只有2M行,这是一个“小”数量,所以大多数数据库可以在一个事务中处理它
如果使用代码方法,大多数数据库都允许您在保持光标打开的同时进行提交,所以只需每隔大约10K行提交一次即可。
与日志记录类似。在事务期间,此类查询中的所有行都被锁定。考虑到跑步需要很长时间,选择一个安静的时间跑步。如果这真的是一件大事,那就把它拼凑起来,但要意识到锁定是不可避免的。
您可以做的一件事是使用生产者/消费者类型模型,在这个模型中,您让一个线程工作来给其他线程提供要更新的记录。这样您就不必担心重复处理了。
问题内容: 线程都是可运行的,并且它们拥有相同的锁。两个线程都可以运行时,它们可以锁定相同的地址吗?那是JRE错误吗? 问题答案: 该问题仅存在于线程转储中。实际上,在任何时间点,锁都仅由一个线程持有。但是,线程转储显示两个具有相同锁的不同线程,因为它不是原子的。 可以使用以下程序轻松重现该行为:
我已经面临这个问题很多天了,请帮我解决。我正在使用线程同步实现生产者-消费者示例。我在这个传统节目中做了一些调整。我没有只使用一个队列对象,而是使用了两个队列对象。但程序不起作用。。(PS-我知道我可以通过只使用队列的一个对象来让这个程序工作,但如果我想使用两个队列对象呢??) 类队列{ } 类生产者实现Runnable{ } 类消费者实现可运行{ } 公共类测试队列{ }
问题内容: 因此,我的目标是让函数启动自己的线程,以便可以并行运行,而不必等待上一个线程完成。问题在于,它似乎不是多线程的(意味着一个线程在另一个线程开始之前就完成了)。 我也有该函数的内部,但似乎启动的线程的标识与从其运行python脚本的主线程相同。我认为我的方法不正确。 问题答案: 这是常见错误,容易出错。 只需在主线程中一次执行您的函数,然后将(我想为您函数的返回值)作为函数传递给线程,这
我一直在尝试写一些java应用程序。这个应用程序想要运行的是处理一个文本文件。 但是,输入文本文件很大(超过200MB),我尝试将200MB拆分为四个拆分文件(每个50MB) 所以,每一个都只需要0.5秒,但是用这种线性运行,每一个也需要2秒。(worker1+0.5s,worker2+0.5s,worker3+0.5s,worker4)如果我可以同时运行4个线程,我预计这个应用程序只需要0.5秒
我对连接池的理解是;如果connectionstring完全相同,那么我们重用该连接,而不是建立新的连接。 我的问题是,我正在为并行处理创建许多线程。在这个“虚拟”程序中,我创建了500个线程,并让线程池函数处理这些线程。 步骤是: > < li> 每个线程在SQL中创建一个更新表。(说明更新的时间戳) 然后线程Hibernate1到10秒(随机)。 最后,线程在 SQL 中进行另一次更新(说明结
我有多个线程在我的中运行每个线程读取一个大文件并在List中返回该文件中的数据。 代码如下所示: 现在我知道以下代码段将出现在我的代码中的某个位置,但我不知道将其放置在哪里。因为如果我在for循环中的之后放置它,它就不会添加它,因为每个文件都非常大,可能还没有完成它的处理。 那么,有谁能告诉我,我应该把这段代码放在哪里,以及我需要确保哪些其他事情,以避免出现关键部分问题。 如果我只是在线程中并行读