J'ai cherché sur Internet pendant N jours et il n'y a presque pas de solutions thread-safe. Le même problème peut être facilement résolu avec Redis. Je l'ai remplacé par une classe d'outils que j'ai trouvée en ligne. Veuillez m'aider à le modifier ou me donner des conseils. .Mon idée actuelle est d'ajouter le mot-clé synchronisé, mais j'ai toujours l'impression qu'il y a un problème. Merci beaucoup !
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;
}
}
Afin de garantir que les données entre les connexions sont indépendantes (non partagées), je suppose que vous souhaitez implémenter un Pool de connexions :
Après une légère modification, c'est peut-être mieux. Il est recommandé d'écouter le copain ci-dessus et d'utiliser un pool de connexions à une base de données mature. Il n'est pas nécessaire de réinventer la roue
.Utilisez singleton pour garantir le caractère unique de la connexion à la base de données
Modifier l'utilisation des
synchronized
mots-clés pour améliorer l'efficacitéAjoutez des
volatile
mots-clés pour améliorer la stabilitéPas besoin de synchroniser, plusieurs connexions n'ont pas d'importance.
La base de données possède son propre verrou.
Vous pouvez également utiliser directement le pool de connexions.
Merci pour vos réponses. J'ai un peu modifié le code. S'il vous plaît, aidez-moi à voir s'il y a un problème. La raison principale est que je n'ai jamais utilisé Java. Ma façon de le gérer est la suivante : à l'exception des constantes, il n'y a pas de classe. variables membres. Tous les paramètres et la valeur de retour sont transmis et toutes les variables sont déclarées dans la méthode