Java Spring@Transactional Timeout未按预期工作

Java Spring@Transactional Timeout未按预期工作,java,spring-transactions,Java,Spring Transactions,我有一个JDBC批量更新操作,这可能需要很长时间,因此我使用事务超时来处理这个问题 @Override @Transactional(propagation=Propagation.REQUIRES_NEW,timeout=10) public void saveAllUsingBatch(List<KillPrintModel> list){ PreparedStatmentMapper ps= new HibernateDao.PreparedStatmentMappe

我有一个JDBC批量更新操作,这可能需要很长时间,因此我使用事务超时来处理这个问题

@Override
@Transactional(propagation=Propagation.REQUIRES_NEW,timeout=10)
public void saveAllUsingBatch(List<KillPrintModel> list){
    PreparedStatmentMapper ps=  new HibernateDao.PreparedStatmentMapper<KillPrintModel>() {

        @Override
        public void prepareStatement(PreparedStatement ps, KillPrintModel t)
                throws SQLException {
            ps.setString(1, t.getOffice());
            ps.setString(2, t.getAccount());
            ps.setDate(3, new java.sql.Date(t.getUpdatedOn().getTime()));
        }
    };
    String sql = String.format("INSERT INTO dbo.%s (%s,%s,%s) VALUES (?,?,?)",KillPrintModel.TABLE_NAME,KillPrintModel.FIELD_Office,KillPrintModel.FIELD_Account,KillPrintModel.FIELD_UpdatedOn);
    this.jdbcBatchOperation(list, sql, ps);
}
@覆盖
@事务性(传播=传播。需要新的,超时=10)
公共void saveAllUsingBatch(列表){
PreparedStationMapper ps=新的HibernateDao.PreparedStationMapper(){
@凌驾
公共无效准备声明(准备声明ps,KillPrintModel t)
抛出SQLException{
ps.setString(1,t.getOffice());
ps.setString(2,t.getAccount());
ps.setDate(3,新的java.sql.Date(t.getUpdateOn().getTime());
}
};
String sql=String.format(“插入dbo.%s(%s,%s,%s)值(?,,?)”,KillPrintModel.TABLE_名称,KillPrintModel.FIELD_办公室,KillPrintModel.FIELD_帐户,KillPrintModel.FIELD_更新);
jdbccbatchoperation(list、sql、ps);
}
即使我的事务时间超过10秒,此方法也会持续一分钟以上(并成功返回)。当超时为0时,它工作正常



这是因为我的线程在开始执行时总是处于运行状态吗?

如果在跟踪模式下调试没有帮助,只需在以下hibernate类中设置一个断点,它们最终会在@Transactional注释的preparedstatement.setQueryTimeout(…)中设置超时

org.hibernate.engine.jdbc.internal.StatementPreparerImpl
private void setStatementTimeout(PreparedStatement preparedStatement) throws SQLException {
            final int remainingTransactionTimeOutPeriod = jdbcCoordinator.determineRemainingTransactionTimeOutPeriod();
            if ( remainingTransactionTimeOutPeriod > 0 ) {
                preparedStatement.setQueryTimeout( remainingTransactionTimeOutPeriod );
            }
        }
或者更好的方法是,在事务管理器中,直到您点击语句setQueryMout(..)为止


您所说的“当超时为0时工作正常”?其中是
HibernateDao
from(library)?当超时为0时,它甚至不进入方法内部。HibernateDao是我的自定义类,它扩展了HibernateDaoSupport(spring framework类)。您可以为
HibernateDao.PreparedStationMapper
(它只是一个接口?)和
this.jdbcBatchOperation()
)共享代码吗?当超时为0时,意味着您不为事务指定超时,它是开放式的
org.springframework.orm.hibernate4.HibernateTransactionManager
int timeout = determineTimeout(definition);
            if (timeout != TransactionDefinition.TIMEOUT_DEFAULT) {
                // Use Hibernate's own transaction timeout mechanism on Hibernate 3.1+
                // Applies to all statements, also to inserts, updates and deletes!
                hibTx = session.getTransaction();
                hibTx.setTimeout(timeout);
                hibTx.begin();
            }
            else {
                // Open a plain Hibernate transaction without specified timeout.
                hibTx = session.beginTransaction();
            }