0

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

2 に答える 2

1

javax.swing.Timerスイング以外のタスクを定期的に実行するクラスは使用しないでください。代わりに、を使用してScheduleExecutorServiceください

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.schedule(new Runnable(){
    @Override
    public void run(){
        // query database
    }
}, 0, 100, TimeUnit.MILLISECONDS);
于 2012-07-07T21:10:26.657 に答える
1

バックグラウンド タスクで Swing コンポーネントを継続的に更新する必要がある場合は、コンポーネントのモデルSwingWorkerを定期的に更新するために使用します。process()このでは、 aJTextAreaは H2 データベースから取得したデータで更新されます。

于 2012-07-08T02:15:42.840 に答える