如何将SQL连接传递给动作监听器。我想有一个无限循环,它会休眠100毫秒。循环的每次迭代均假定查询数据库。摇摆计时器是执行此操作的最佳方法吗?如果是这样,我如何将连接传递给动作监听器。如果不是这样,有人可以建议如何做到这一点。非常感谢。

码:

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.
}

最佳答案

不要使用javax.swing.Timer类来定期执行非swing任务。而是使用ScheduleExecutorService

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

09-25 21:47