0

SQL データベース内のテーブルをクエリするたびに、100 ミリ秒ごとにループするスレッドをセットアップしようとしています。これが私のpublic static voidメインクラスにあるものです。リスナーの外部で接続を定義し、ループ内でのみクエリを呼び出すにはどうすればよいですか?

    // Database credentials
    final String url = "jdbc:mysql://192.168.0.0/";
    final String db = "db";
    final String driver = "com.mysql.jdbc.Driver";
    final String table = "table";
    public final Connection conn = null;

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

            System.out.println("Reading Info.");
            try {
                Class.forName(driver);
                try {
                    conn = DriverManager.getConnection(url+db,"root","pass");
                    Statement st = (Statement) conn.createStatement();
                    String sql = "";
                    st.executeUpdate(sql);
                    conn.close();

                } catch (SQLException s) {
                    s.printStackTrace();
                    JOptionPane.showMessageDialog(null, "ERROR: Please try again!");
                }
            } catch (ClassNotFoundException cnfe){
                JOptionPane.showMessageDialog(null, "ERROR:");  
            }
        }
        };
    Timer timer = new Timer( 100 , taskPerformer);
    timer.setRepeats(true);
    timer.start();

    Thread.sleep(100);

}

現在、次のエラーが表示されています。

スレッド「AWT-EventQueue-0」での例外 java.lang.Error: 未解決のコンパイルの問題: 最終的なローカル変数 conn は、外側の型で定義されているため、割り当てることができません

4

2 に答える 2

1

あなたはしたくない。JDBC 仕様により、接続はスレッドセーフではありません。したがって、接続変数がスレッドに対してローカルではない理由や正当化はありません。なぜそうではないのですか?

于 2012-07-07T05:16:52.453 に答える
0

近接していない問題に対する回答が得られたので、近接の問題でそれを補足させてください。あなたはこれを持っています:public final Connection conn = null;これは意味がありません。変数に割り当てnullました。内部クラスで非最終変数を使用しているとコンパイラが不平を言ったためにfinal追加した可能性があります。finalおそらく達成したいのは、遅延初期化されたシングルトンです。修飾子を削除してfinalから、必要に応じて接続を取得して初期化する別の同期関数を記述します。

private Connection conn;
private synchronized Connection connection() {
  if (conn == null) conn = createConnection();
  return conn;
}

もちろん、接続を同時に使用しないようにする方がよいでしょうが、ユースケースではそれが必要ではありません。接続プーリングに対するこの単純なアプローチのもう 1 つの問題は、接続が無効な状態のままになることです。

于 2012-07-07T08:32:01.367 に答える