将SQL连接传递给ActionListener(线程)

时间:2012-07-07 20:25:11

标签: java sql swing actionlistener

如何将SQL连接传递给Action Listener。我希望有一个无限循环,睡眠时间为100毫秒。每次迭代都会假设循环查询数据库。摆动计时器是最好的方法吗?如果是这样,我如何将连接传递给Action Listener。如果没有,有人可以建议如何做到这一点。非常感谢。

代码:

public static void main(String[] args) throws InterruptedException {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    AdminManager frame = new AdminManager();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });

        BoneCP connectionPool = null;
        Connection connection = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        try {
            // setup the connection pool
            BoneCPConfig config = new BoneCPConfig();
            config.setJdbcUrl("jdbc:mysql://192.162.0.0");
            config.setUsername("root"); 
            config.setPassword("");
            connectionPool = new BoneCP(config); // setup the connection pool

            connection = connectionPool.getConnection(); // fetch a connection

            if (connection != null){
                System.out.println("Connection successful!");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }


        // Define listner
        ActionListener taskPerformer = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                //...Perform a task...

                String sql = "SELECT * table;";
                Statement st = connection.createStatement();
                ResultSet rs = st.executeQuery(sql);
                while(rs.next()) {
                    String symbol = rs.getString("name");
                    System.out.println(symbol);
                }

            }
            };
        Timer timer = new Timer( 100 , taskPerformer);
        timer.setRepeats(true);
        timer.start();

        Thread.sleep(1000);

        //connectionPool.shutdown(); // shutdown connection pool.
}

2 个答案:

答案 0 :(得分:1)

javax.swing.Timer类不要定期执行非Swing任务。相反,请使用ScheduleExecutorService

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.schedule(new Runnable(){
    @Override
    public void run(){
        // query database
    }
}, 0, 100, TimeUnit.MILLISECONDS);

答案 1 :(得分:1)

如果后台任务必须不断更新Swing组件,请使用SwingWorkerprocess()定期更新组件的模型。在此example中,使用从H2数据库获取的数据更新JTextArea