gpt4 book ai didi

java - 帮助 java 线程和执行器 : Executing several MySQL selects, 同时插入和更新

转载 作者:行者123 更新时间:2023-11-29 15:01:34 26 4
gpt4 key购买 nike

我正在编写一个应用程序来分析MySQL数据库,我需要同时执行多个DML;例如:

// In ResultSet rsA: Select * from A;
rsA.beforeFirst();
while (rsA.next()) {
id = rsA.getInt("id");
// Retrieve data from table B: Select * from B where B.Id=" + id;
// Crunch some numbers using the data from B
// Close resultset B
}

我声明了一个数据对象数组,每个数据对象都有自己的数据库连接,该连接依次调用多个方法进行数据分析。问题是所有线程都使用相同的连接,因此所有任务都会抛出异常:“超出锁定等待超时;尝试重新启动事务”

我相信有一种方法可以编写代码,使任何给定的对象都有自己的连接,并独立于任何其他对象执行所需的任务。例如:

DataObject dataObject[0] = new DataObject(id[0]);
DataObject dataObject[1] = new DataObject(id[1]);
DataObject dataObject[2] = new DataObject(id[2]);
...
DataObject dataObject[N] = new DataObject(id[N]);
// The 'DataObject' class has its own connection to the database,
// so each instance of the object should use its own connection.
// It also has a "run" method, which contains all the tasks required.
Executor ex = Executors.newFixedThreadPool(10);

for(i=0;i<=N;i++) {
ex.execute(dataObject[i]);
}
// Here where the problem is: Each instance creates a new connection,
// but every DML from any of the objects is cluttered in just one connection
// (in MySQL command line, "SHOW PROCESSLIST;" throws every connection, and all but
// one are idle).

你能指出我正确的方向吗?

谢谢

最佳答案

我认为问题在于您将大量中间层、事务性和持久性逻辑混入一个类中。

如果您直接处理 ResultSet,您就不会以非常面向对象的方式思考事物。

如果您能弄清楚如何让数据库进行一些计算,那么您就很聪明。

如果没有,我建议尽可能保持连接打开的最短时间。打开一个Connection,获取ResultSet,将其映射到一个对象或数据结构,在本地范围内关闭ResultSet和Connection,并返回映射的对象/数据结构进行处理。

您可以通过这种方式将持久性和处理逻辑分开。通过保持短暂的联系,你可以避免很多悲伤。

如果存储过程解决方案速度缓慢,可能是由于索引不良造成的。另一种解决方案的性能即使不是更差,也同样差。尝试运行 EXPLAIN PLAN 并查看是否有任何查询正在使用 TABLE SCAN。如果是,您需要添加一些索引。如果您的事务长时间运行,也可能是由于大量回滚日志造成的。您可以而且应该做很多事情,以确保您在切换之前已经使用现有的解决方案做了一切可能的事情。您可能付出了巨大的努力,但仍然无法解决根本原因。

关于java - 帮助 java 线程和执行器 : Executing several MySQL selects, 同时插入和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2953955/

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