gpt4 book ai didi

java - 如何跳过测试代码或将oracle语法转换为h2

转载 作者:行者123 更新时间:2023-12-02 04:14:58 27 4
gpt4 key购买 nike

我和我的团队正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com