当前位置: 代码迷 >> Web前端 >> web施用oracle迁移mysql开发版(四)
  详细解决方案

web施用oracle迁移mysql开发版(四)

热度:74   发布时间:2012-09-28 00:03:35.0
web应用oracle迁移mysql开发版(四)

收尾工作

?

回想一下,我们的去O工作完成了么?还没有,我们还在单元测试的阶段。
这时候需要做2个工作:


1、找到开发线上data-source.xml,更换成单元测试的“样子”类似下面的:

?

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass"><value>com.mysql.jdbc.Driver</value></property>
        <property name="jdbcUrl"><value>${adminPortal_database_url}</value></property>
        <property name="properties">
          <props>
            <prop key="user">${adminPortal_database_username}</prop>
            <prop key="password">${adminPortal_database_password}</prop>
          </props>
        </property>
        <property name="testConnectionOnCheckin" value="true" />
        <property name="testConnectionOnCheckout" value="true" />
        <property name="idleConnectionTestPeriod" value="60" />
</bean>

?

2、更改antx.properties里的配置项。(发布时需要SA帮忙把配置项更新成mysql的

?

注:这里的antx.properties是一个属性文件,公司web框架的一个配置文件,用于初始化信息用的。每个公司可能不同,也有可能没有这个配置文件,而是写死在xml文件里的。

?

一些额外的注意点

?

1、建表语句


在PLSQL中我们导出表结构是这样的

create table AP_BANK
(
  ID           NUMBER(12) not null,
  GMT_CREATE   DATE default SYSDATE not null,
  GMT_MODIFIED DATE default SYSDATE not null,
  BANK_CODE    VARCHAR2(64) not null,
  DISPLAY_NAME VARCHAR2(128) not null,
  DISABLE      CHAR(1) default 'N' not null,
  PARTNER      VARCHAR2(64) not null,
  BANK_TYPE    VARCHAR2(32) default 'bank' not null
);
comment on column AP_BANK.ID
  is '主键';
……

?

?

在Navicat中导出的表结构是这样的

?

CREATE TABLE ap_bank (
  id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  gmt_create datetime NOT NULL COMMENT '系统创建时间',
  gmt_modified datetime NOT NULL COMMENT '系统修改时间',
  bank_code varchar(64) NOT NULL COMMENT '银行编号',
  display_name varchar(128) NOT NULL COMMENT '显示名',
  disable char(1) NOT NULL DEFAULT 'N' COMMENT '是否可用',
  partner varchar(64) NOT NULL COMMENT '合作者',
  bank_type varchar(32) COMMENT '银行类型',
  PRIMARY KEY (id)
) ENGINE=InnoDB COMMENT='银行信息表';

?

?

这里的 ENGINE=InnoDB 是必须的。还可以在表注释前加上,AUTO_INCREMENT=162表示起始从162自增,DBA说不需要这样做。

小技巧:在shell命令行下用 show create table 表名; 可以查看当初的sql语句。

?

2、c3p0的配置


刚才说道还有3个配置项没有解释为什么要加,因为在测试的时候发现一个问题,就是如果页面长时间无操作,且没session超时。但此时很可能数据库连接断开了,虽然我们配置了重连选项,但依旧会报错。百度了一下,加上这三个配置<property name="testConnectionOnCheckin" value="true" /><property name="testConnectionOnCheckout" value="true" /><property name="idleConnectionTestPeriod" value="60" />
就OK了。
异常说明:Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost
百度了一下,有个人也遇见了这个异常,解决方法就是添加这三个配置项

?

3、关于org.springframework.test.AbstractTransactionalDataSourceSpringContextTests的单元测试。


还记得建表时的ENGINE=InnoDB么?当我们使用spring的单元测试时,我们如果没有指定引擎会导致事务无法回滚。
引用iteye里的答案:
没有指定表的引擎. 而Mysql5.x在linux下的默认引擎是MyISAM, 而不是期望的InnoDB, 所以建立数据库表时如果没有指定引擎, 那么表的引擎MyISAM, 从而导致不支持事务. 解决办法是把所有的表的引擎改为InnoDB后, 事务正常回滚了.”

?

4、关于利用sql脚本来批量初始化数据库


有一些web程序,在做biz层的单元测试时,会利用一个统一的sql脚本来批量初始化数据,来达到避免在单元测试中赘述DAO的insert语句。
在你的初始化sql脚本中,注意不要将ID设置成0,否则每一次执行单元测试时,都会向表中插入一条数据。而在mysql的命令行下,即使设置id为0也不会影响对数据库的插入动作。

  相关解决方案