【问题标题】:Could not get JDBC Connection / Transaction is not active无法获取 JDBC 连接/事务未激活
【发布时间】:2020-01-14 10:28:40
【问题描述】:

我在通过 Spring Jdbc 调用我的数据库时遇到了困难,关于堆栈溢出的问题都没有对我有用,所以这就是我问它的原因。

这是我的 DAO

public class CruDao extends JdbcDaoSupport implements ICruDao{

    private final Logger LOG = LoggerFactory.getLogger(CruDao.class);

    @Override
    public String obtainCode(String codiModel) {
        String code = null;

        SimpleJdbcCall funcio = new SimpleJdbcCall(getJdbcTemplate()).withFunctionName("funcCru");
        MapSqlParameterSource parameter = new MapSqlParameterSource().addValue("id", codiModel);

        try {
            code = funcio.executeFunction(String.class, parameter);
            LOG.debug("Generated Code: " + code);

        }catch(Exception ex){
            LOG.error("Error",ex);
        }

        return codiCRU;
    }

}

这是调用executeFunction 行时抛出的异常:

org.springframework.dao.DataAccessResourceFailureException: Error retreiving database metadata; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.jboss.util.NestedSQLException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f5796c1:d4ac:5e1c3647:9ff status: ActionStatus.ABORTED >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f5796c1:d4ac:5e1c3647:9ff status: ActionStatus.ABORTED >)

我已经用数据库的信息正确地声明了数据源的bean。

编辑 我调用 DAO 的方法已经是 @Transactional

@Override
    @Transactional
    public byte[] obtenirModel(String codiModel) {

        byte[] genDocByteArray = null;

        codiCRU = cruDao.obtainCode(codiModel);

        if(codiCRU == null || codiCRU.length() < 1){
            log.error("Errorrr");
            return null;
        }

        ...

我错过了什么?感谢您的建议。

【问题讨论】:

  • 错误告诉你究竟出了什么问题。没有活跃的交易。您定义事务管理器这一事实并不意味着您有事务。您仍然必须将代码/方法标记为事务性的。请将 xml 配置添加为文本而不是图像,后者非常不可读。
  • 抱歉,xml 无法读取,顺便说一下,我调用 DAO 的方法已经是事务性的。我的DAO的接口也应该有Transactional注解吗? @M.Deinum
  • 在 XML 中添加 @Transactional 而没有 &lt;tx:annotation-driven /&gt; 不会使其具有事务性。
  • 您是否启用了事务管理(通过注释(配置类上的@EnableTransactionManagement)或通过xml 配置(&lt;tx:annotation-driven/&gt;)?

标签: java spring jdbc


【解决方案1】:

您在访问数据库时需要有一个活跃的事务。您已经在 xml 中定义了事务管理器 bean,但没有使用它。您需要注释服务方法 @Transactional 谁正在调用此 obtainCode 方法。另请注意,@Transactional 注解的方法需要公开并从另一个 bean 调用(由于代理机制),才能使其正常工作。

【讨论】:

  • 我在调用 DAO 的方法中已经有了 Transactional 注释,所以我缺少什么?我的DAO的接口是否也应该有@Transactional注解?
  • 不需要在界面上使用它。并且您检查了 @Transactional 注释方法是公共的并从另一个 bean 调用?你可以分享调用者的一些代码sn-p。
猜你喜欢
  • 2017-11-09
  • 2017-08-02
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2014-07-18
相关资源
最近更新 更多