有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java BasicDataSource提交不起作用

我已配置数据源并将自动提交设置为false

<bean id="dbDataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
        <property name="driverClassName" value="${widget.database.driver}" /> 
        <property name="url" value="${widget.database.url}" /> 
        <property name="defaultAutoCommit" value="false" /> 
        <property name="accessToUnderlyingConnectionAllowed" value="true" />
        <property name="username" value="${widget.database.username}" />
        <property name="password" value="${widget.database.password}" />
        <property name="maxActive" value="${widget.database.maxActive}" /> 
        <property name="maxIdle" value="${widget.database.maxIdle}" /> 
    </bean> 

在我的刀课上,我已经做到了

    public void insertDIMFactToDB(WidgetJobOutput jobOutput) throws DataAccessException {
        int rowsInserted=0;     
    try {
        logger.info("Databse insert for DIMCODE " + jobOutput.getDimCode() + " having DIMFACT value as : " + + jobOutput.getDimFact());
        jdbcTemplate = new JdbcTemplate(dataSource);

        Object[] params = new Object[] { 
                    jobOutput.getDimCode(), 
                    jobOutput.getDimFact()
                                };
        rowsInserted = jdbcTemplate.update(DBConstants.INS_WIDGET_HRLY_DATA, 
                        params);
        //logger.info("Successfully inserted/updated " + rowsInserted +  " in DB");

    } catch (DataAccessException e) {
        throw e ;
    }
    // commit everything 
    try {
    DataSourceUtils.getConnection(jdbcTemplate.getDataSource()).commit();
        logger.info("Successfully inserted/updated " + rowsInserted +  " in DB");
    } catch (SQLException e) {
        logger.error("Error Occured while commiting data into DB:-"+ ExceptionUtils.getFullStackTrace(e));
    }


    }

但它既没有抛出任何异常,也没有提交数据。 请帮我找到错误。提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    我们还需要查看DAO源代码,但似乎您正在提交一个与正在执行SQL的连接不同的连接

    dataSource.getConnection().commit();
    

    将从您的池中获取下一个可用连接,该连接将不是您刚刚用于更新的连接(因为该连接可能仍在使用中)

  2. # 2 楼答案

    下面的语句将为您提供一个新连接,并将尝试在该连接上提交。但是,您希望提交用于运行查询的相同连接

    JdbcTemplate().getDataSource().getConnection().commit();  
    

    如果要在数据源属性配置中将自动提交用作false,请尝试使用老式的提交方式

       Connection conn = null;
       PreparedStatement  stmt  = null;
       boolean result = false;
       try{
           conn = getJdbcTemplate().getDataSource().getConnection();
           stmt = conn.prepareStatement(sql.toString());
          // stmt.setString(1, "ABC");
                  result = stmt.executeUpdate();
                conn.commit();          
            } catch (SQLException e) {
                // LOGGER.error();
            }finally{
                if(stmt != null){
                    try {
                        stmt.close();
    
                    } catch (SQLException e) {
                         // LOGGER.error();
                    }
                }
            }