Avant-propos
Souvent, nous avons besoin de connaître plus de détails sur le fonctionnement du programme, mais il est impossible d'imprimer tous les détails de fonctionnement du programme pendant le développement Accédez au journal. Habituellement, ce que vous pouvez faire à ce stade est de modifier le code, de le redéployer, puis de l'observer à nouveau. Cependant, cette méthode n'est pas très adaptée aux applications en ligne. difficile à modifier, comme d'autres packages externes référencés, etc. sont très gênants. BTrace est un outil qui peut afficher dynamiquement les détails de l'exécution du programme sans modifier le code ni redémarrer l'application. L'article suivant présente la méthode btrace pour localiser les défauts de production. , les amis dans le besoin peuvent s'y référer.
Phénomènes
Certaines requêtes sont très lentes à travers la couche d'accès aux données et provoquent le blocage du thread de traitement, et l'exception ne peut pas être détectée à partir de la surveillance.
Écrire le script btrace
@BTrace public class DBProxyTrace { @OnMethod(clazz = "xxx.xxx.QueryHandler", method = "query", location = @Location(Kind.RETURN)) public static void trace2(String sql, @Duration long duration) { if (duration/1000000 > 10 * 1000) { com.sun.btrace.BTraceUtils.println(duration/1000000 + "ms"); com.sun.btrace.BTraceUtils.println("this task executes more than 10s. the sql is : " + sql); com.sun.btrace.BTraceUtils.println("jstack is : "); com.sun.btrace.BTraceUtils.jstack(); } } }
Juger le SQL et les informations de pile exécutées pendant plus de 10 secondes .
Compilez le script DBProxyTrace.Java et confirmez qu'il n'y a aucun problème avec le script.
./bin/btracec -cp build/ java/DBProxyTrace.java
Exécuter le script DBProxyTrace.class
./bin/btrace -cp build/ 17342 DBProxyTrace.class
Message
10468ms this task executes more than 10s. the sql is : rollback jstack is : xxx.QueryHandler.query(QueryHandler.java:106) xxx.net.AbstractConnection.onReadData(AbstractConnection.java:245) xxx.net.NIOReactor$RW.run(NIOReactor.java:77) java.lang.Thread.run(Thread.java:745)
Le positionnement
est bloqué lors de l'annulation de la transaction.
Utilisez jstack pour un positionnement ultérieur.
Imprimer la pile JVM
"$_NIOREACTOR-7-RW" prio=10 tid=0x00007f069856f000 nid=0xde1 waiting for monitor entry [0x00007f0677011000] java.lang.Thread.State: BLOCKED (on object monitor) at Oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1167) - waiting to lock <0x000000068086fbc0> (a oracle.jdbc.driver.T4CConnection)
Conclusion
Blocage Dans l'action de restauration du pilote Oracle, cela est en fait dû au fait que le pilote Oracle ajoute un verrou au niveau de la couche inférieure pour garantir la réponse à la demande série, et ce canal est bloqué par des instructions lentes, donc la restauration est bloquée.
Pour plus d'articles liés à la méthode de localisation des défauts de production de btrace, veuillez faire attention au site Web PHP chinois !