我写个方法,返回的是一个布尔类型,为什么我用连接oracle操作就返回true,用mysql连接操作返回是false,报错为:Connection is read-only. Queries leading to data modification are not allowed 说连接是只读的

解决方案 »

  1.   

    /**
     * 注销
     * 
     * @author ray_guan
     */
    @SuppressWarnings("deprecation")
    @Override
    public int updateLogout(LogoutUtil logoutUtil,String tableName) {
    int rc = 0;
    StringBuilder sql = new StringBuilder();
    sql.append("UPDATE "+tableName+" t SET t.zxrq = ?,");
    sql.append("t.sfzx = ?,t.zxyy = ?,t.zxlrr = ?,");
    sql.append("t.zxlrdw = ?,t.zxlrsj = ?,");
    sql.append("t.lastupdatedby = ?,t.lastupdatedtime = ? ");
    sql.append("WHERE t.yxtid = ?");
    Session session = getSession();
    Connection conn = session.connection();
    try {
    PreparedStatement pstmt = conn.prepareStatement(sql.toString());
    pstmt.setString(1, logoutUtil.getZxrq());
    pstmt.setString(2, logoutUtil.getSfzx());
    pstmt.setString(3, logoutUtil.getZxyy());
    pstmt.setString(4, logoutUtil.getZxlrr());
    pstmt.setString(5, logoutUtil.getZxlrdw());
    pstmt.setString(6, logoutUtil.getZxlrsj());
    pstmt.setString(7, logoutUtil.getLastupdatedby());
    pstmt.setString(8, logoutUtil.getLastupdatedtime());
    pstmt.setString(9, logoutUtil.getYxtid());

    rc = pstmt.executeUpdate();
    } catch (SQLException e) {
    logger.error(e.getMessage());
    rc = 0;
    }finally{
    WSUtil.closeConnection(conn);
    releaseSession(session);
    }
    return rc;
    } <!-- BoneCP 连接池 -->
    <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
    destroy-method="close">

    <!--  Oracle数据库连接
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.0.233:1521:orcl" />
    <property name="username" value="znsq" />
    <property name="password" value="znsq" />-->
     
     
     <!-- mysql数据库连接-->
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/znsq2011" />
    <property name="username" value="root" />
    <property name="password" value="sa" /> 


    <!-- 每多少秒检查所有连接池中的空闲连接 -->
    <property name="idleConnectionTestPeriod" value="60" />
    <!-- 设置连接空闲时间(分钟) -->
    <property name="idleMaxAge" value="240" />
    <!-- 设置连接池设在每个分区中的最大连接数 -->
    <property name="maxConnectionsPerPartition" value="2" />
    <!-- 设置连接池设在每个分区中的最小连接数 -->
    <property name="minConnectionsPerPartition" value="1" />
    <!-- 设置分区 -->
    <property name="partitionCount" value="3" />
    <!-- 当连接池中的连接耗尽的时候 BoneCP一次同时获取的连接数 -->
    <property name="acquireIncrement" value="1" />
    <!-- 
    <property name="statementsCacheSize" value="100" />
     -->
    <!-- 连接释放处理 -->
    <property name="releaseHelperThreads" value="3" />
    </bean> <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
    <props>

    <!--oracle数据库 
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
     -->

    <!-- mysql数据库 -->
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>


    <prop key="hibernate.show_sql">true</prop>
    </props>
    </property>
    <property name="mappingResources">
    <list>
    <value>com/pasqgaxt/pojo/Resident.hbm.xml</value>
    <value>com/pasqgaxt/pojo/RentalHouse.hbm.xml</value>
    <value>com/pasqgaxt/pojo/Industry.hbm.xml</value>
    </list>
    </property>
    </bean> <!-- 配置事务 -->
    <bean id="htm"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <tx:advice id="txAdvice" transaction-manager="htm">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" read-only="true" /> 
    <tx:method name="add*" propagation="REQUIRED" />
    <tx:method name="delete*" propagation="REQUIRED" />
    <tx:method name="update*" propagation="REQUIRED" />
    <!-- <tx:method name="logout*" propagation="REQUIRED" />  --> 
    </tx:attributes>
    </tx:advice>

    <aop:config>
    <aop:pointcut expression="execution(* com.pasqgaxt.biz.impl.*.*(..))" id="bizMethods"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods"/>
    </aop:config>
     
     <bean id="wsAccessDataDao" class="com.pasqgaxt.dao.impl.WsAccessDataDaoImpl">
      <property name="sessionFactory" ref="sessionFactory" />
     </bean>
     
     <bean id="wsAccessDataBiz" class="com.pasqgaxt.biz.impl.WsAccessDataBizImpl">
      <property name="iWsAccessDataDao" ref="wsAccessDataDao" />
     </bean>
    </beans>
      

  2.   

    <tx:method name="*" propagation="REQUIRED" read-only="true" />  把这一行去掉。
      

  3.   

    你这边只有
    方法名前缀为
    <tx:method name="add*" propagation="REQUIRED" />
    <tx:method name="delete*" propagation="REQUIRED" />
    <tx:method name="update*" propagation="REQUIRED" />
    才可以修改数据库,
    其他的方法名前缀都是只读的,或者你将你的方法名改为 add  delete update前缀的也可以。
      

  4.   

    那就把<tx:method name="*" propagation="REQUIRED" read-only="true" /> 
    改为
    read-only = “false”