【发布时间】:2015-06-06 15:12:07
【问题描述】:
我有一个生产 Oracle 数据库,我使用 HSQLDB 2.3 作为集成测试数据库来验证一些 DAO 方法。我注意到 HSQL 不能很好地处理来自 Java 的 PreparedStatement 的日期和参数绑定。例如,下面的查询按预期工作,假设 column2 是日期类型:
select
column1,
column2
from
table
where
trunc(column2) = trunc(sysdate + 14)
and column3 = ?
但是,当我在第一个参数 (?) 上设置 Int preparedStatement.setInt(1, 14) 时,这另一个查询根本不起作用。不用说它在 Oracle 中完美运行。
select
column1,
column2
from
table
where
trunc(column2) = trunc(sysdate + ?)
and column3 = ?
奇怪的是,如果您尝试select (sysdate + 14) future from any_single_row_table 之类的操作,它会按预期工作,但如果您尝试select (sysdate + ?) future from any_single_row_table,它会显示当前日期
为什么会这样?它是 HSQL 准备语句实现中的错误吗?有什么解决办法吗?
【问题讨论】:
-
另一个很好的例子,说明使用与生产环境不同的 DBMS 进行测试是个坏主意。
-
在我的完美世界中,Oracle 和所有大玩家都将拥有用于测试目的的极轻量“内存”数据库,因此我们不会出现这种不匹配的情况。但不幸的是,在残酷的现实世界中情况并非如此,我们必须依靠这些次优的解决方案才能继续前进并提供优质产品。
-
我认为不需要用于测试的轻型内存数据库。只需设置一个运行 Oracle 的服务器并让您的单元测试连接到该服务器。它甚至可以在您的 CI 服务器上运行——如果您不对其施加沉重的负载,Oracle 实际上并不需要那么多资源。你目前的问题只是冰山一角
-
如果您有一个非常小的团队在处理相同的组件,那么您的解决方案很酷,否则这是一场噩梦,因为您永远无法确定 DB 状态是什么,或者如果 DDL 已更改,您也不知道.在每个开发人员工作站中安装 Oracle XE 是一种矫枉过正的做法。其实这是一个没完没了的讨论。
-
我说的不是在开发人员的计算机上安装一次。我说的是所有单元测试都使用的一个专用服务器。当然,您需要像 Liquibase 这样与您的构建系统集成的东西,以使数据库模型自动保持最新。
标签: java sql prepared-statement hsqldb