2012-06-08 1 views
1

Я разрабатываю приложение в java для обработки данных и загрузки его в базу данных MySQL. С помощью этого приложения я повторяю все файлы, которые необходимо обработать в каталоге. С каждой строкой файла я храню данные из этой строки в различные переменные и делаю некоторые преобразования, чтобы получить все данные, готовые для загрузки в мою базу данных. Затем я планирую загрузить данные этой строки в базу данных с помощью запроса PreparedStatement и INSERT.JDBC connection pooling advice

Я не знаком с лучшими практиками для моей ситуации. Я в процессе обучения этому себе, поэтому я ищу небольшое руководство, чтобы убедиться, что я делаю это правильно в первый раз.

Было бы неуместным просто открыть соединение в начале среды выполнения приложения (то есть открыть его один раз)? Для каждого запроса на вставку я создавал и закрывал PreparedStatement, но я просто оставил бы соединение открытым, пока не закончу обработку всех файлов.

Я читал о пулах соединений в другом месте, но я не могу понять, применимо ли оно в моей ситуации. Я знаю, что дорого его часто открывать и закрывать, но не могу ли я просто открыть его один раз и запустить все мои запросы в этом соединении?

Если вы рекомендуете использовать пул соединений, какую службу вы бы порекомендовали для моей ситуации. Предпочтительно быстро получить ручку. Мой проект несколько чувствителен к времени. Благодарю.

+0

Взгляните на [c3p0] (http://www.mchange.com/projects/c3p0/). – dasblinkenlight

+0

Как долго это приложение должно работать? 1 минута? 15 минут? 1 час? Сколько пользователей будет использовать его одновременно? Только 1? Или несколько? MySQL по умолчанию восстанавливает соединение, когда он был открыт в течение 8 часов, поэтому, если ваше приложение работает более 8 часов, оно сломается, если вы оставите одно соединение открытым долго. Пулы соединений особенно полезны для приложений с продолжительным сроком службы, которые используются несколькими параллельными пользователями, такими как веб-приложения Java EE. – BalusC

+0

Он, надеюсь, займет около 15 минут или меньше. Это будет зависеть в основном от количества файлов, которые мне нужно обработать. Только один будет использовать его одновременно. Из того, что вы сказали, это звучит так, как будто я могу быть в порядке, просто открывая соединение, обрабатывая данные, вставляя их, а затем закрывая соединение. Это верно? – Mike

ответ

3

Если вы разрабатываете настольное приложение Java, вы не будете использовать пулы соединений. Пулы соединений управляются Java-серверами приложений (Tomcat, JBoss, Glassfish) и не будут доступны в настольном приложении Java.

Сохранение связи открыто правдоподобно, если вы собираетесь делать только одно обновление.

Кроме того, партия обновление будет отличная идея для вас:

String connectionURL = "jdbc:mysql://localhost:3306/database"; 
Connection con = null; 
PreparedStatement stmt = null; 

try { 
    Class.forName("com.mysql.jdbc.Driver"); 
    con = DriverManager.getConnection(connectionURL); 
    stmt = con.prepareStatement(statement); 

    for (Object o : list) { // this is a list of your Java entity class 
     stmt.setString(1, "foo"); // this is to update the parameters in the PreparedStatement 
     stmt.setString(2, "bar"); 

     stmt.addBatch();  // this adds the PreparedStatement to the batch of statements to execute 
    } 

    stmt.executeBatch(); 

} catch (SQLException e) { 
    e.printStackTrace(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if (stmt != null) { 
     stmt.close(); 
    } 
    if (con != null) { 
     con.close(); 
    } 
} 

Идея пакетного обновления должен иметь одно подготовленное заявление, в котором вы можете просто изменить параметры, а также добавить «новый "в партию заявлений. Затем вы можете выполнить их все за один раз, когда вы вызываете stmt.executeBatch()

Я бы посоветовал вам, однако, выполнить заявления, вероятно, 30 за раз, если у вас много таких утверждений. В противном случае вы оказались бы в затруднительном положении, если программа выйдет из строя/завершится сбой.

+0

это просто программа командной строки больше, чем полностью интерактивное приложение. Каждую ночь он должен был обработать файлы и вставить в базу данных. спасибо за ваши предложения – Mike

+0

Тогда вы не сможете использовать пулы подключений. Код, который я предложил выше, будет хорошо для вас :) –

+0

awesome. Большое спасибо. – Mike

0

Это звучит как пакетный процесс, который вы реализуете. В этом случае лучшим решением является выделенное соединение с базой данных.

+0

Как было бы лучше собрать все мои данные один раз, а затем загрузить его как пакет? Что делает что-то выделенное соединение по сравнению с соединением, которое я уже использую? – Mike

+0

То, что вы используете в настоящее время, называется выделенным соединением. – steve