J'ai une application java tcp socket. Tcp communicateur décode l'emplacement GPS et insère ces données dans la base de données et avant d'insérer nous faisons quelques sélections et mises à jour, mais tout ce que je fais en utilisant des instructions préparées. À l'heure actuelle, un thread de TCP communicateur sert une demande de périphérique. Immédiatement après la création du thread, nous obtenons une connexion à partir du pool. Après le décodage des données GPS est l'endroit où nous effectuons la sélection multiple, mise à jour et insérer pour chaque donnée. Comme le nombre d'appareils augmente, le nombre de connexions simultanées à notre base de données Mysql augmente également. Donc, j'essaie d'effectuer une simulation et un test de stress quelque chose comme ci-dessous. Le problème est qu'il s'agit d'un test séquentiel, mais dans un environnement réel, les périphériques viendront en parallèle. Comment atteindre une situation de stress proche de la réalité pour mysql et java pour savoir combien d'insertions pourraient être prises en compte en second?Test de stress parallèle à MySQL et java
public class stress1 extends Thread {
public static void main(String[] argv) {
try {
for (int i = 0; i < 5000; i++) {
Socket socket = new Socket("192.168.2.102", 8000);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out.println("$A12345,30061104075130528955N10024852E000068*03A1*");
System.out.println(in.readLine() + i);
out.close();
in.close();
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Voici à quoi ressemble mon socket serveur.
public class comm8888 {
HikariDataSource connectionPool = null;
private Socket receivedSocketConn1;
ConnectionHandler(Socket receivedSocketConn1) {
this.receivedSocketConn1=receivedSocketConn1;
}
Connection dbconn = null;
public void run() { // etc
DataOutputStream w = null;
DataInputStream r = null;
String message="";
receivedSocketConn1.setSoTimeout(60000);
dbconn = connectionPool.getConnection();
dbconn.setAutoCommit(false);
try {
w = new DataOutputStream(new BufferedOutputStream(receivedSocketConn1.getOutputStream()));
r = new DataInputStream(new BufferedInputStream(receivedSocketConn1.getInputStream()));
while ((m=r.read()) != -1){
//multiple prepared based sql select,update and insert here.
}
}
finally{
try {
if (dbconn != null) {
dbconn.close();
}
}
catch(SQLException ex){
ex.printStackTrace();
}
try{
if (w != null){
w.close();
r.close();
receivedSocketConn1.close();
}
}
catch(IOException ex){
ex.printStackTrace(System.out);
}
}
}
}
public static void main(String[] args) {
new comm8888();
}
comm8888() {
try {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/testdata");
config.setUsername("****");
config.setPassword("****");
config.setMaximumPoolSize(20);
connectionPool = new HikariDataSource(config); // setup the connection pool
}
catch (Exception e) {
e.printStackTrace(System.out);
}
try
{
final ServerSocket serverSocketConn = new ServerSocket(8888);
while (true){
try {
Socket socketConn1 = serverSocketConn.accept();
new Thread(new ConnectionHandler(socketConn1)).start();
}
catch(Exception e){
e.printStackTrace(System.out);
}
}
}
catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
instructions d'insertion sont vraiment lent. Je ne le ferais pas comme ça. Je voudrais d'abord enregistrer toutes les données dans un arraylist et puis le charger jusqu'à la base de données en utilisant quelque chose comme LOAD DATA IN FILE. Tu ne peux pas faire ça? Si vous voulez voir à quel point les instructions d'insertion sont mauvaises, il suffit de les inclure dans votre boucle et vous verrez le désordre. – Arminius
@Arminius Je peux les garder dans un tableau de la question, ils sont quelques milliers d'unités se connecteront dans une minute. Ainsi, chacun enverra des données individuelles. Mais avant cela, j'ai besoin de lancer quelques instructions de sélection et de mise à jour, puis enfin faire ces instructions d'insertion. – user8012596