我和我的团队正在使用 Oracle 数据库进行开发和生产。但为了节省时间,我们决定使用H2数据库进行测试,因为它速度很快。
现在我们遇到了一个与 SQL 语法相关的问题。
public void lock(Collection<String> locks) {
if (locks== null || locks.size() == 0)
return;
Connection dbc = null;
Statement st = null;
String q = null;
try {
dbc = db.getConnection();
dbc.setAutoCommit(false);
st = dbc.createStatement();
st.setFetchSize(fetchSize);
q = "LOCK TABLE resource_lock IN EXCLUSIVE MODE";
st.executeUpdate(q);
// Update the lock info in DB
List idLists = DbUtil.splitIdList(locks);
Iterator i = idLists.iterator();
while (i.hasNext()) {
List idList = (List) i.next();
q =
"DELETE FROM resource_lock\n" +
"WHERE " + DbUtil.generateStrIn("lock", idList);
st.executeUpdate(q);
}
st.close();
st = null;
dbc.commit();
dbc.close();
dbc = null;
} catch (SQLException e) {
throw new DbException(e, q);
} finally {
DbUtil.cleanup(log, null, st, dbc);
}
}
问题发生于 “以独占模式锁定表资源锁” 这是 Oracle 独有的语法。在我编写的测试中,它总是抛出语法错误,其中指出
Caused by: com.resource.db.DbException: Database Error: Syntax error in SQL statement "LOCK[*] TABLE RESOURCE_LOCK IN EXCLUSIVE MODE "; SQL statement:
LOCK TABLE resource_lock IN EXCLUSIVE MODE [42000-160]
Last SQL was:
LOCK TABLE resource_lock IN EXCLUSIVE MODE
我想知道 H2 是否有具有等效操作的语法。 如果没有,那么我想知道如何跳过本节进行测试,因为许多其他类方法使用它来更新数据库。 我不希望其他测试因此而失败。
最佳答案
要对不同的数据库使用不同的 SQL 命令,您可以为您的应用程序创建一个 DAO 层:
- 使用
deleteLock()
、 等方法创建接口(interface)
- 在您的应用程序逻辑中,使用此方法而不是直接 SQL 查询
- 为不同的数据库创建 DAO 接口(interface)的多个实现
- 将“Oracle”实现与 Oracle DB 结合使用,将“H2”实现与 H2 结合使用
当然,测试与生产中运行的实现不同的实现存在风险,但这就是您已经在做的事情。
<小时/>示例:
我的服务:
private LockDao lockDao;
...
public void lock(Collection<String> locks) {
...
lockDao.deleteLocks(locks);
...
}
LockDao:
public void deleteLocks(Collection<String> locks);
OracleLockDao:
@Override
public void deleteLocks(Collection<String> locks) {
...
q = "LOCK TABLE resource_lock IN EXCLUSIVE MODE";
st.executeUpdate(q);
...
q =
"DELETE FROM resource_lock\n" +
"WHERE " + DbUtil.generateStrIn("lock", idList);
st.executeUpdate(q);
...
}
H2LockDao:
@Override
public void deleteLocks(Collection<String> locks) {
// H2 implementation of lock deletion
}
关于java - 如何跳过测试代码或将oracle语法转换为h2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33418546/