Saya mencari di Internet selama N hari, dan hampir tiada penyelesaian yang selamat untuk thread Masalah yang sama boleh diselesaikan dengan mudah dengan Redis Saya menukarnya kepada kelas alat yang saya temui dalam talian .Idea semasa saya adalah untuk menambah kata kunci yang disegerakkan, tetapi saya masih merasakan bahawa terdapat masalah.
class MySQLUtil {
private static final String driver = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://192.168.31.103:3306/";
private static final String character = "?useUnicode=true&characterEncoding=utf8";
private static final String ssl = "&useSSL=false";
private static final String user = "root";
private static final String password = "111111";
private static Connection connection = null;
private static Statement statement = null;
private static PreparedStatement ps = null;
private static ResultSet rs = null;
boolean TestConnection(String db) {
try {
Class.forName(driver);
Connection connection = DriverManager.getConnection(url + db + character + ssl, user, password);
if (!connection.isClosed()) {
CloseConnection();
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
synchronized private void ConnectToDB(String db) {
try {
Class.forName(driver);
Connection connection = DriverManager.getConnection(url + db + character + ssl, user, password);
if (!connection.isClosed()) {
statement = connection.createStatement();
}
} catch (Exception e) {
e.printStackTrace();
}
}
synchronized private void CloseConnection() {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
synchronized void ModifyData(String db, String data) {
ConnectToDB(db);
try {
statement.execute(data);
} catch (SQLException e) {
e.printStackTrace();
} finally {
CloseConnection();
}
}
synchronized List ReadData(String db, String data) {
List<String> list = new ArrayList<>();
int count;
ConnectToDB(db);
try {
rs = statement.executeQuery(data);
ResultSetMetaData rsmd;
rsmd = rs.getMetaData();
count = rsmd.getColumnCount();
while (rs.next()) {
for (int i = 1; i <= count; i++) {
String label = rsmd.getColumnLabel(i);
list.add(label);
String value = rs.getString(i);
list.add(value);
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
CloseConnection();
}
return list;
}
}
Untuk memastikan data antara sambungan adalah bebas (tidak dikongsi), saya rasa anda mahu melaksanakan Kolam sambungan:
Selepas sedikit pengubahsuaian, mungkin lebih baik untuk mendengar rakan di atas dan menggunakan kumpulan sambungan pangkalan data yang matang. Tidak perlu mencipta semula roda
penggunaan kata kunci untuk meningkatkan kecekapan
synchronized
kata kunci untuk meningkatkan kestabilan
volatile
Tidak perlu menyegerakkan, berbilang sambungan tidak penting.
Pangkalan data mempunyai kuncinya sendiri.
Anda juga boleh menggunakan kolam sambungan secara terus.
Terima kasih atas jawapan anda Saya menukar sedikit kod. Tolong bantu saya melihat jika ada masalah pembolehubah ahli Semua parameter dan Nilai pulangan diluluskan dan semua pembolehubah diisytiharkan dalam kaedah