[英]Java Swing Timer with SQL
我正在嘗試設置一個線程,該線程每查詢SQL數據庫中的表的一次迭代就每100毫秒循環一次。 這是我的公共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無法分配,因為它是用封閉類型定義的
你不想 根據JDBC規范,連接不是線程安全的。 因此,沒有理由或理由說明Connection變量不在線程本地。 為什么不呢
既然您已經對非緊急問題有了一個答案,那么讓我用您的緊急問題來補充一下。 您具有: public final Connection conn = null;
這沒有任何意義。 您已將null
分配給final
變量。 您可能添加了final
因為編譯器抱怨您在內部類中使用了非最終變量。 您可能想要實現的是延遲初始化的單例。 刪除final
修飾符,然后編寫一個單獨的同步函數來檢索連接並根據需要對其進行初始化:
private Connection conn;
private synchronized Connection connection() {
if (conn == null) conn = createConnection();
return conn;
}
當然,最好確保不要同時使用連接,但是用例不要求這樣做。 這種幼稚的連接池方法的另一個問題是連接保持無效狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.