Как установить постоянное соединение с сервером БД с помощью Java? - PullRequest
0 голосов
/ 23 марта 2012

Итак, я пытаюсь оптимизировать приложение Java, которое использует библиотеку java sql для чтения и записи с удаленного сервера SQL.(это для проекта).

Мы ограничены следующими библиотеками:

com.mysql.*
java.io.*
java.lang.*
java.sql.*
java.text.*
java.util.*
javax.sql.*

И у нас есть ограничение памяти 8 МБ на нашей JVM.

Способкод устанавливается прямо сейчас, для каждой функции, которой требуется доступ к базе данных, создается и закрывается новое соединение.например:

public static void Read()
{
    Connection connection = NULL;
    try {
        connection  = DriverManager.getConnection(EnvManager.getDbUrl());
        Statement statement = connection.createStatement();

    statement.setFetchSize(Integer.MIN_VALUE);

        ******* FUNCTION ********
    }finally {
    if(connection != null) {
        try {
        connection.close();
        } catch (Exception e) {
        }
    }
}

     public static void Write()
{
    Connection connection = NULL;
    try {
        connection  = DriverManager.getConnection(EnvManager.getDbUrl());
        Statement statement = connection.createStatement(); 
    statement.setFetchSize(Integer.MIN_VALUE);

        ******* FUNCTION ********
    }finally {
    if(connection != null) {
        try {
        connection.close();
        } catch (Exception e) {
        }
    }
}

и т. д.

Я пытаюсь установить постоянное соединение, чтобы я мог либо передать объект соединения, то есть

...
...
Connection connection = NULL;
try {
    connection  = DriverManager.getConnection(EnvManager.getDbUrl());
Read(connection);
Write(connection);

}finally {
    if(connection != null) {
        try {
        connection.close();
        } catch (Exception e) {
        }
    }
...
...

Однако, когда я пытаюсь сделать это, всякий раз, когда я пытаюсь записать, а затем прочитать большой файл в базу данных (что-либо более 5 МБ), моя JVM продолжает выдавать ошибки, которые исчерпаны в памяти.

Мой вопрос в основном, что происходит, когда вы создаете один объект подключения и продолжаете передавать его в функцию?Кажется, что он каким-то образом растет или размножается каждый раз, когда его используют.

Я посмотрел на этом сайте:

http://benjchristensen.com/2008/05/27/mysql-jdbc-memory-usage-on-large-resultset/

В котором предлагалось использовать функцию statement.setFetchSize(Integer.MIN_VALUE);для сокращения JVM-буферизации всего набора результатов в памяти по умолчанию, но это не помогло.

Любые идеи о том, как решить эту проблему, будут высоко оценены, спасибо.

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Если вы передаете одну и ту же ссылку на объект другим методам, это НЕ должно реплицировать что-либо. Вы просто передаете ссылку на объект. может случиться так, что вы, вероятно, не закрываете свои операторы Statement или PreparedStatements каждый раз, когда выполняете свой SQL.

Вам нужно закрыть все ресурсы, которые будут использовать ресурсы после того, как вы закончите выполнение запроса. Вот пример

public void Read() {
    Connection conn = null;
    Statement statement = null;
    ResultSet rs = null;

    try {
        connection  = DriverManager.getConnection(EnvManager.getDbUrl());
        statment = connection.createStatement();
        statement.setFetchSize(Integer.MIN_VALUE);

        // Do more stuff, iterate to ResultSet etc...
    } catch (SQLException ex) {
        // Exception handling stuff
        ...
    } finally {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) { /* ignored */}
        }
        if (statment != null) {
            try {
                statment.close();
            } catch (SQLException e) { /* ignored */}
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) { /* ignored */}
        }
    }
}
0 голосов
/ 23 марта 2012

Возможно, вам нужно закрыть операторы в Read () и Write ().Ресурсы, связанные с этими объектами (в данном случае буферы, используемые для чтения / записи данных файла), не освобождаются до тех пор, пока они не будут закрыты.Закрытие соединения автоматически закрывает оператор, созданный с ним, но если вы собираетесь сохранить соединение открытым, вам нужно закрыть оператор, когда вы закончите с ним.

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