Java 如何使用JdbcInterceptor重试查询

Java 如何使用JdbcInterceptor重试查询,java,mysql,apache,tomcat,database-connection,Java,Mysql,Apache,Tomcat,Database Connection,我想在死锁的情况下重试MySql查询,如果我可以简单地重试,死锁将被删除 我使用ApacheTomcatJDBC池库进行mysql连接池,它有JdbcInterceptor对象的概念,可以附加到现有的连接对象。我想知道如何使用这些拦截器进行查询重试。我如何知道查询是否引发了异常,我应该重试 我正在考虑做类似的事情,但我对获得正确的重试逻辑感到困惑: public class JdbQueryRetryInterceptor extends JdbcInterceptor { privat

我想在死锁的情况下重试MySql查询,如果我可以简单地重试,死锁将被删除

我使用ApacheTomcatJDBC池库进行mysql连接池,它有JdbcInterceptor对象的概念,可以附加到现有的连接对象。我想知道如何使用这些拦截器进行查询重试。我如何知道查询是否引发了异常,我应该重试

我正在考虑做类似的事情,但我对获得正确的重试逻辑感到困惑:

public class JdbQueryRetryInterceptor extends JdbcInterceptor {
    private final static Logger logger = LoggerFactory
            .getLogger(JdbQueryRetryInterceptor.class);



    @Override
    public void reset(ConnectionPool parent, PooledConnection con) {


    }
}
我在池属性中添加了这个拦截器:

p.setJdbcInterceptors("com.test.mysql.JdbQueryRetryInterceptor");
我不确定它是否可以在拦截器级别完成,但是因为tomcat文档说它可以完成,所以我想采用这种方法

能够配置自定义拦截器。这允许您编写自定义拦截器以增强功能。你可以用 用于收集查询统计信息、缓存会话状态和重新连接的拦截器 失败时的连接、重试查询、缓存查询结果,以及 等等。你的选择是无止境的,拦截器是动态的,而不是动态的 绑定到java.sql/javax.sql接口的JDK版本


是什么让你认为只要重试就可以消除僵局?死锁表示应用程序中存在设计错误。不要试图围绕它们编码:修复它们。是的,你是对的,不是所有的死锁都可以被移除,但是这个死锁可以。我看到innodb状态和两个线程锁定了同一个页面。我认为这个特定的查询可以重试。