【问题标题】:Can Spring's Embedded HSQL database support the Sybase dialect?Spring 的 Embedded HSQL 数据库能否支持 Sybase 方言?
【发布时间】:2012-08-10 21:15:52
【问题描述】:

我希望能够在使用 HSQL 的单元/集成测试中支持以下 Sybase 15 ASE 语法...

create table #myTable (value varchar(12) NULL)

HSQL 无法识别临时表是如何命名的,并在# 字符处犹豫不决。相反,HSQL 想使用这样的东西......

create temporary table myTable (value varchar(12) NULL)

或者,根据他们的文档,HSQL 也支持大多数 ANSI-92 SQL,但是 Sybase ASE 15 对 ANSI-92 SQL 的支持不是很好,包括如何创建临时表,因此以下内容在 Sybase 中不起作用,但是在 HSQL 中...

DECLARE LOCAL TEMPORARY TABLE mytable (value varchar(12) NULL)

从我尝试过的所有内容中,我无法想出一个适用于 Sybase 和 HSQL 的通用语法。有谁知道解决这个问题的干净方法?

我认为我唯一的选择是为每种数据库方言创建单独的 DAO,并控制在 Spring Application Context XML 文件中使用哪一个。

我的数据源不使用 Hibernate,只使用 Spring 的 JdbcTemplate。

【问题讨论】:

    标签: spring hsqldb embedded-database sap-ase


    【解决方案1】:

    我选择通过为我的 DAO 实现几个方言助手类来解决这个问题。我的目标是

    1. 针对 HSQL 数据库而不是 Sybase 执行测试
    2. 尽可能多地测试我的生产 DAO,包括 RowMapper 和针对生产中使用的数据库模式的各种 SELECT/INSERT 语句(但在 HSQL 中实现)

    我的 DAO 最终看起来像这样(注意被注入的 DialectHelper)...

    @Repository
    public class MyDaoJdbc MyDao {
    
        private DialectHelper dialectHelper;
    
        /* the meat of the DAO removed for clarity */
    
        @Override
        public void createTemporaryTable() {        
            getSimpleJdbcTemplate().update(dialectHelper.getTempTableCreateSql());
        }
    
        @Autowired
        public final void setDialectHelper(DialectHelper dialectHelper) {
            this.dialectHelper = dialectHelper;
        }
    }
    

    ...我的生产 Spring 配置 (spring-db.xml) 看起来像这样并注入了 Sybase 方言

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName"    value="com.sybase.jdbc2.jdbc.SybDriver" />
        <property name="url"                    value="${jdbc.url}" />
        <property name="username"           value="${jdbc.username}" />
        <property name="password"           value="${jdbc.password}" />
    </bean>
    
    <bean id="dialectHelper" class="com.acme.myapp.jdbc.DialectHelperSybase" />
    

    ... 我的测试 Spring 配置 (spring-db-test.xml) 看起来像这样并注入 HSQL 方言

    <jdbc:embedded-database id="dataSource" type="HSQL">
         <jdbc:script location="classpath:/resources/schema.sql"/>
         <jdbc:script location="classpath:/resources/test-data.sql"/>
    </jdbc:embedded-database>
    
    <bean id="dialectHelper" class="com.acme.myapp.dao.jdbc.DialectHelperHsql" />
    

    DialectHelper 类提供了一种将不兼容的数据库语法从 DAO 中分离出来的方法......

    public class DialectHelperHsql implements DialectHelper {
        @Override
        public String getTempTableCreateSql() {
            return "create temporary table myTable (value varchar(12) NULL)";
        }
    }
    
    public class DialectHelperSybase implements DialectHelper {
        @Override
        public String getTempTableCreateSql() {
            return "create table #myTable (value varchar(12) NULL)";
        }
    }
    

    Test 类本身通过加载文件 spring-db-test.xml 使用 HSQL dialectHelper 初始化 Spring

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={
        "classpath:resources/spring-context.xml",
        "classpath:resources/spring-db-test.xml"})
    @Transactional
    @TransactionConfiguration(defaultRollback = true)
    public class MyDaoIntegrationHsqlTest {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 2017-12-14
      • 2011-03-01
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多