0

接続プール オブジェクトを ScheduledExecutorService スレッドに渡す必要がありますが、そうするのが困難です。宣言の前に final を追加しようとしましたが、次のエラーがスローされます... 最終的なローカル変数接続を割り当てることができません。空白で、複合代入を使用していない必要があります

この接続オブジェクトを適切に渡すにはどうすればよいですか?

public class AdminManager extends JFrame {

    private JPanel contentPane;
    private JTable tableQueue;
    private JTable tableFilled;

    /**
     * Launch the application.
     * @throws InterruptedException 
     */

    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 {
            // load the database driver (make sure this is in your classpath!)
            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.0.0.1:3306/db"); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
            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();
                }
            }
        }        
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
        exec.scheduleAtFixedRate(new Runnable(){
            @Override
            public void run(){
                System.out.println("Working ... ");
                String sql = "SELECT * FROM table;";
                Statement st;
                try {
                    st = connection.createStatement();
                    ResultSet rs = st.executeQuery(sql);
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }
        }, 2000, 1000, TimeUnit.MILLISECONDS);
4

1 に答える 1

1

エグゼキューター内でのみ使用されるダミー参照を定義できます。

final Connection conn = connection;

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(new Runnable(){
        @Override
        public void run(){
            System.out.println("Working ... ");
            String sql = "SELECT * FROM table;";
            Statement st;
            try {
                st = conn.createStatement();
                ResultSet rs = st.executeQuery(sql);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        }
    }, 2000, 1000, TimeUnit.MILLISECONDS);

この方法で問題を解決できない場合 (残りのコードが表示されない場合)、コードを保持する外部タスク クラスを定義できます。

class ThreadTask implements Runnable {
     private Connection connection;

     public ThreadTask(Connection c) {
          connection = c;
     }

     @Override
     public void run() {
        System.out.println("Working ... ");
        String sql = "SELECT * FROM table;";
        Statement st;
        try {
            st = connection.createStatement();
            ResultSet rs = st.executeQuery(sql);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }
}

と:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new ThreadTask(connection));
于 2012-07-08T17:47:30.143 に答える