0

我有一个 java 程序,它为从数据库中读取的每个字段创建线程。我有很多领域(+10,000)。我遇到了严重缓慢的问题。除此之外,程序最后进入一个无限循环。即,有一个或多个线程永远不会结束,这使得循环无限。我试图减少程序从 Java 代码中读取的字段数量,方法是指定要读取的项目的编号 (PK),如下面的语句所示:

"select hName from schema.table where 
ID between 1 AND 200";

此更改后程序运行良好。我需要知道我应该怎么做才能解决这样的问题。包含诸如 (where) 之类的条件的语句会影响 java 程序的性能吗?如果我没有指定订单或条件,但我的表中有主键,那么在没有任何条件的情况下创建语句是更好的选择吗?

其他类中还有一些其他的插入语句。我确实在那里同步语句以避免两个线程具有相同的记录号。

synchronized (this) {
            Query = " insert into schema.table values (default,?,?,?)";
            Stmt = DBConnection.con.Statement(Query);
        } 

主要功能中的相关代码是:

try {
    ExecutorService threadExecutor = Executors.newFixedThreadPool(10);

    while (resultSet.next()) {
        name = resultSet.getString("hName");
        MyRunnable worker = new Myrunnable(name);
        threadExecutor.execute(worker);
        Counter++;
    }

    //This never appears
    System.out.println("End while with counter" + Counter);

    threadExecutor.shutdown();
    System.out.println("thread shutdown"); //this never appears

    // Wait until all threads are finish
    while (!threadExecutor.isTerminated()) {
        threadExecutor.awaitTermination(1, TimeUnit.SECONDS);
        System.out.println("inside the thread termination loop."); //I have infinite loop

    }

    System.out.println("Finished all threads"); //never appears

} catch (Exception e) {
    e.printStackTrace();
}

System.out.println("END MAIN");

DBConnection.con.close();

实现runnable的类在这里:

//The constructor
String threadName=null;
MyRunnable (String name)  {
    threadName=name;
}

public void run() {
    myclass Obj=new myclass();
    try {
        Obj.myFunction(name);
    } catch (Exception e) {
        System.out.println("Got an Exception: "+e.getMessage());
    }
    System.out.println(" thread exiting" + threadName);
}
4

2 回答 2

2

问:我有一个 java 程序,它为从数据库中读取的每个字段创建线程。我有很多领域(+10,000)

危险,威尔罗宾逊!

有没有人在设计阶段提出建议……这太疯狂了?不要那样做:)

问:包含条件的语句是否会影响 java 程序的性能?

答:您是在问“带有“where”子句的 SQL 查询通常比整个表的幼稚转储执行得更好吗?”

如果是这样:是的,已经知道“where”子句可以提高查询性能:)

于 2012-07-25T19:23:27.857 回答
1

不受其他事实的束缚,我无法想象您为什么会出于任何原因创建 10,000 个线程。即使在具有数十个内核的服务器上,上下文切换也会杀死您。你的代码是如何执行的?在 PC 上运行的简单 java 程序中?在服务器上?如果它在服务器上运行,您应该考虑使用应用程序服务器。然后您可以利用以下几点:首先,您可以摆脱所有线程的使用并依赖应用程序服务器将请求扩展到逻辑组件(可能使用 EJB3 组件——我建议您看看) . 其次,您可以利用连接池。创建与数据库的连接是一项昂贵的提议。如果您在池中使用连接,应用程序服务器将处理管理所有连接,

最后,确保您的表上有适当的索引。例如,我假设 ID 已被索引。是这样吗?运行解释计划,并查看正在扫描表的多少行来回答查询(有关如何使用解释计划功能的说明,请参阅 MySQL 文档)。

于 2012-07-26T01:22:36.810 回答