gpt4 book ai didi

java - 通过从 Scala/Java 编写/执行 SQL 脚本来处理间歇性数据库连接

转载 作者:搜寻专家 更新时间:2023-11-01 02:56:10 31 4
gpt4 key购买 nike

我正在开发一个需要将信息存储到数据库的应用程序。如果可能的话,我想使用 Scala 解决方案。如果由于某种原因数据库连接失败,我想将本应执行的原始 SQL 语句写入 .sql 脚本文件。这个想法是,当/如果恢复与数据库的连接时,我想在 Scala/Java 中执行该脚本以使数据库恢复同步。如果程序出现故障,最好有 .sql 脚本,这样就可以手动执行脚本。

在Scala/Java中如何将要执行的sql语句记录到文件中?那么,我如何在 Scala/Java 中执行该文件(或实际上任何 .sql 脚本)?

最佳答案

您可以代理您的连接对象:

public class ConnectionProxy {

public ConnectionProxy(Object anObject) {
super(anObject);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(target, args);
String methodName = method.getName();

if (methodName.equals("createStatement")) {
result = ProxyBuilder.createProxy(result, new StatementProxy(result));
}

return result;
}
}

为了拦截对 Statement.execute(String sql) 的任何调用:

public class StatementProxy {

public StatementProxy(Object anObject) {
super(anObject);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
return method.invoke(proxy, args);
} catch (SQLException sqle) {
if (method.getName().contains("execute")) {
String sql = "";

if (args != null && args[0] != null) {
sql = args[0].toString();
}

saveToFile(arg);
}

throw sqle;
}
}
}

其中 ProxyBuilder 是一个简单的辅助类:

public final class ProxyBuilder {

public static Connection tracingConnection(Connection connection) {
return createProxy(connection, new ConnectionProxy(connection));
}

static <T> T createProxy(T anObject, InvocationHandler invocationHandler) {
return createProxy(anObject, invocationHandler, anObject.getClass().getInterfaces());
}

static <T> T createProxy(T anObject, InvocationHandler invocationHandler, Class... forcedInterfaces) {
return (T) Proxy.newProxyInstance(
anObject.getClass().getClassLoader(),
forcedInterfaces,
invocationHandler);
}
}

当然,这不是您的最终生产代码,但它是一个很好的起点。

关于java - 通过从 Scala/Java 编写/执行 SQL 脚本来处理间歇性数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1132593/

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