【问题标题】:Java thread for JDBC用于 JDBC 的 Java 线程
【发布时间】:2014-10-09 22:33:11
【问题描述】:

我有带有 JDBC 的 GUI 应用程序。一个线程用于摆动 gui。

public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {

            public void run()
            {
                try {
                    runApp();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }

启动程序后,我在 JTable 中显示数据库中的数据。

public List<Category> getCategory() throws SQLException
    {
        List<Category> cat = new ArrayList<Category>();

        Connection conn = Database.getInstance().getConnection();

        System.out.println(conn);

        String sql = "select id, name from kategorie";
        Statement selectStatement =  conn.createStatement();

        ResultSet results = selectStatement.executeQuery(sql);

        while(results.next())
        {
            int id = results.getInt("id");
            String name = results.getString("name");

            Category category = new Category(id, name);
            cat.add(category);
        }

        results.close();
        selectStatement.close();

        return cat;

    }

我想知道如何添加一个新线程,以便所有数据库操作在一个单独的线程中运行,而不是这个线程摆动。

【问题讨论】:

  • 是的,看看SwingWorker。我也可能会为您的用例找到一个示例。虽然我需要一些它:-)
  • This tutorial 很好。
  • @lukassz:我已经更新了previous link 中的代码,以真正遵守Swing 的单线程规则。再次检查一下,这次它不会出现任何错误,只需运行JAR文件。/database.rar
  • @lukassz:在这个问题上,我似乎无法理解你。但是我确实查看了代码,但我找不到,您将它添加到表中的确切位置。您只是在MySQLCategoryDAO 类中调用了getCategory(),尽管您从未向JTable 添加任何内容。
  • @lukassz:对我来说似乎有点困惑,无法掌握代码。试着做一个小东西,简单地包括你想要实现的东西,不要直接把它整合到你的项目中,只是看流程。只需将从数据库中检索值的部分借给Database 类,而不是到处编写代码。以前从未在MySQL 上工作过,所以无法运行它。一个理解流程的小例子,将不胜感激。

标签: java multithreading swing jdbc


【解决方案1】:

ExecutorService 类为例。

ExecutorService exec = Executors.newFixedThreadPool(2);
exec.execute(new Runnable() { 
// Run your database thread

});
exec.shutdown();

【讨论】:

  • 好的。你觉得这个解决方案怎么样stackoverflow.com/questions/3489543/…
  • @lukassz:在检索值结束时,JTable 必须在 Event Dispatcher Thread - EDT 上更新。因此,如果您选择SwingWorker,那东西不会让您头疼,因为process()/done() 方法默认将所有东西放在EDT 上。
  • @lukassz 更好,并记录 nIcE cOw 笔记
猜你喜欢
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-06
  • 1970-01-01
  • 2011-05-21
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多