我写个方法,返回的是一个布尔类型,为什么我用连接oracle操作就返回true,用mysql连接操作返回是false, 我写个方法,返回的是一个布尔类型,为什么我用连接oracle操作就返回true,用mysql连接操作返回是false,报错为:Connection is read-only. Queries leading to data modification are not allowed 说连接是只读的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /** * 注销 * * @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> <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" />才可以修改数据库,其他的方法名前缀都是只读的,或者你将你的方法名改为 add delete update前缀的也可以。 那就把<tx:method name="*" propagation="REQUIRED" read-only="true" /> 改为read-only = “false” Java Web项目中两种导入外来Jar包的区别 报错了 这是为什么? 發現個 hibernate Bug 找討論 这个是啥意思? java实习 lcene中设置Boots问题,急啊 struts标签<html:messages>当中的name属性问题 jbuilder的设置怎么这么烦啊?请好心人来帮帮忙呀!! EJB的部署? 二道问题,请高手帮忙! 关于Ajax的局部刷新页面技术 struts2 JSP向 ACTION传递对象问题
* 注销
*
* @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>
方法名前缀为
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
才可以修改数据库,
其他的方法名前缀都是只读的,或者你将你的方法名改为 add delete update前缀的也可以。
改为
read-only = “false”