问题描述
系统用的是SSH框架:我系统登录、退出要写入数据库日志。有时候很偶然的在退出时写数据库日志报错。错误是日志表主键冲突,可怎么也想不明白为什么冲突。这时候再登陆也登陆不进去了,因为也要插入日志表,还是主键冲突。过10多分钟吧,才能正常登陆,退出也正常了。1.主键生成方式无论是native还是increament都会报相同的错误(偶尔)2.SSH集成了hibernate和Spring的JdbcTemplate,由Spring共同管理事务3.不知道是不是事务的问题,不过在系统其它地方操作数据库的地方没有发现这样的问题。配置代码:<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="url" value="jdbc:oracle:thin:@192.168.1.10:1521:orcl"></property><property name="username" value="cmonitor"></property><property name="password" value="cmonitor"></property><property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property><property name="maxActive" value="10"></property><property name="maxIdle" value="100"></property><property name="maxWait" value="10"></property><property name="defaultAutoCommit" value="true"></property></bean><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop><prop key="hibernate.show_sql">false</prop></props></property><property name="mappingResources"><list><value></value></list></property></bean><bean id="JdbcTemplate" class ="org.springframework.jdbc.core.JdbcTemplate"> <property name ="dataSource" ref="dataSource"></property> </bean> <!--配置hibernate事务管理--><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property><property name="dataSource" ref="dataSource"></property></bean><tx:annotation-driven transaction-manager="transactionManager"/><bean id="txManager" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property></bean>
解决方案
最好在自己机器上debug一下,看看登录或是退出时生成的主键是否数据库里已经存在了。看看是不是其他地方约定了主键的生成。采用increament是不会出现上面的问题的。