Работа с прерывистым подключением к базе данных путем написания / выполнения сценария SQL из Scala / Java - PullRequest
4 голосов
/ 15 июля 2009

Я занимаюсь разработкой приложения, которое должно хранить информацию в базе данных. Я хотел бы использовать решение Scala, если это возможно. Если по какой-либо причине соединение с базой данных не удается, я бы хотел записать необработанные операторы SQL, которые были бы выполнены, в файл сценария .sql. Идея состоит в том, что когда / если будет восстановлено соединение с базой данных, я хотел бы выполнить этот скрипт в Scala / Java, чтобы вернуть базу данных в синхронизацию. Также хорошо иметь сценарий .sql на случай, если в программе произойдет сбой, чтобы можно было выполнить сценарий вручную.

Как мне записать SQL-операторы, которые я собираюсь выполнить, в файл в Scala / Java? Затем, как мне выполнить этот файл (или любой другой скрипт .sql) в Scala / Java?

1 Ответ

4 голосов
/ 15 июля 2009

Вы можете прокси-объект вашего соединения:

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);
        }
}

Конечно, это не ваш окончательный код производства , но это хорошая отправная точка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...