gpt4 book ai didi

multithreading - GORM实例对象线程安全

转载 作者:行者123 更新时间:2023-12-02 14:05:57 25 4
gpt4 key购买 nike

说我有以下域类。具有多对一关系的EmployeeCompany

class Employee {

String id
String firstName
String lastName
String email
Company company

static mapping = {
table name: "employee"
id column: "employee_id", generator:"assigned"

version false
}
}

class Company {
String id
String name

static hasMany = [employees:Employee]

static mapping = {
table name: "company"
id column: "company_id", generator:"assigned"

autoImport false
version false
}
}

我想做的是从数据库中获取一个 Company对象,然后派生多个线程为该公司创建 Employees。但是,我不确定 Company对象是否是线程安全的。

例如:
public void createEmployees(companyId, employees){

// Find the new created company - this is on the main thread
Company company = Company.findById(companyId) // Is company thread safe?
def lines = parseEmployees(employeeFile) // parses info about each employee that will later be used to create employee objects
ExecutorService executor = Executors.newFixedThreadPool(10)

List futures = new ArrayList()

lines.each { line ->

Future future = executor.submit(new Callable() {
public def call() throws Exception {
def employee = saveEmployee(line, company) // Is the company object thread safe here?
return employee
}
});
futures.add(future)
}

executor.shutdown()

for(Future future : futures){
def employee = future.get()
println employee
}
}

public Employee saveEmployee(line, company) {

Employee employee = new Employee()

employee.firstName = line.firstName
employee.lastName = line.lastName
employee.email = employee.email
employee.id = line.id
employee.company = company // thread safe?

employee.save()
}

同样,我不确定传递给 Company方法的Hibernate托管 saveEmployee对象是否是线程安全的。我的理解是 Thread中的每个 Executor将具有其自己的Hibernate session ,该 session 不是线程安全的。我以为我可能需要在 merge对象上调用 attachCompany,但看来我不需要。一切似乎都可以正常工作,但是很难确定何时涉及多线程。

最佳答案

在您提供的示例中,传递的Company对象没有被修改,因此它是否是线程安全的都没有关系。 (虽然不是;如果您在多个线程中对其进行更改,则将获得StaleObjectStateExceptions。)

您的Company员工hasMany,并且在当前映射中,引用实际上存储在Employee中(可能是company_id字段)。由于您在与员工建立关联时并没有从技术上修改Company对象,因此不会造成问题。

有很多方法可以确认这一点(因为要测试所有奇怪的线程边缘情况确实很困难!),但在我看来,最简单的方法可能是确认添加新员工时version对象上的Company字段没有增加。如果没有增加,您可以确信它没有被修改,因此线程在这里不起作用。

关于multithreading - GORM实例对象线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52705263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com