JDBC фундаментальные понятия, Объединяя и Распараллеливая

Попробуйте uname -m . Который нуждается uname --machine, и это производит:

x86_64 ==> 64-bit kernel
i686   ==> 32-bit kernel

Иначе, не для ядра Linux, а для ЦП , Вы вводите:

cat /proc/cpuinfo

или:

grep flags /proc/cpuinfo

Под параметром "флагов", Вы будете видеть различные значения: см." , Что делает флаги в среднем/proc/cpuinfo? " Среди них, каждого называют lm: Long Mode ( x86-64: amd64, также известный как Intel 64, т.е. 64-разрядный способный)

lm ==> 64-bit processor

Или использование lshw (как упомянуто ниже [1 116] Rolf из Саксонии ), без [1 110] (только для захвата ширины CPU):

lshw -class cpu|grep "^       width"|uniq|awk '{print $2}'

Примечание: у Вас может быть 64-разрядный ЦП с 32-разрядным ядром, установленным .
(как [1 117] ysdx упоминает в [1 118] его собственный ответ , "В наше время, система может быть мультидуга , таким образом, это не имеет смысла так или иначе. Вы могли бы хотеть найти цель по умолчанию компилятора")

8
задан 2 revs 13 August 2009 в 14:56
поделиться

7 ответов

Пулы соединений украшают экземпляры соединений и инструкций своими собственными реализациями оболочки. Когда вы вызываете закрытие соединения, вы фактически просто возвращаете его обратно в пул. Когда вы вызываете close для подготовленного оператора, вы фактически просто возвращаете его обратно в кеш операторов соединения. Когда вы готовите оператор, вы можете просто получить кэшированный экземпляр оператора из соединения. Все это скрыто от глаз, так что вам не нужно об этом беспокоиться.

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

Вы должны использовать соединение из пула так же, как и одиночное соединение JBDC, и следовать рекомендациям по закрытию ресурсов, чтобы что вы не пропускаете никаких связей или заявлений. См. Примеры try / catch / finally в некоторых других ответах.

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

См. Примеры try / catch / finally в некоторых других ответах.

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

См. Примеры try / catch / finally в некоторых других ответах.

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

6
ответ дан 5 December 2019 в 08:54
поделиться
  1. Транзакции происходят на уровне соединения.

  2. Нет. Обычно драйвер JDBC гарантирует, что вы не сможете выполнить второй оператор по тому же соединению, пока другое соединение активно.

Если вам требуется пул соединений, попробуйте инфраструктуру DBCP . Он предлагает довольно приличную обработку сбоев (например, обнаружение устаревших соединений и соединений, которые не были возвращены клиентским кодом).

Что касается вашего кода: всегда помещайте код в try {...} finally {.. .} :

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
     conn = ds.getConnection ();
     stmt = ...
     rs = ...
}
finally {
     rs = close (rs);
     stmt = close (stmt);
     conn = close (conn);
}

public static Connection close (Connection conn) {
    if (conn != null) {
        try {
            conn.close ();
        }
        catch (SQLException e) {
            e.printStackTrace(); // Log, don't rethrow!!
        }
    }
    return null;
}

Этот код гарантирует, что все соединения и т. Д. Всегда правильно закрываются и что любое исключение во время закрытия не скроет предыдущую ошибку.

3
ответ дан 5 December 2019 в 08:54
поделиться

Посмотрите на это (+:

0
ответ дан 5 December 2019 в 08:54
поделиться

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

Кроме того, если вы собираетесь пойти по пути стандартного JDBC, Я рекомендую использовать PreparedStatement вместо Statement.

Я использовал iBatis, и это довольно приятно. Приносит еще несколько вещей на стол.

1
ответ дан 5 December 2019 в 08:54
поделиться

Если вы освоили JDBC с одиночным -threading, переход к многопоточности и пулам соединений не должно иметь большого значения. Все, что вам нужно сделать иначе, это: 1. Когда вам нужно соединение, получите его из пула, а не напрямую. 2. Каждый поток должен иметь свои собственные соединения.

Чтобы прояснить пункт 2: если вы получаете соединение и затем передаете его нескольким потокам, у вас может быть два потока, пытающихся одновременно выполнять запросы к одному и тому же соединению. Java выбрасывает исключения из этого. У вас может быть только один активный оператор для каждого соединения и один активный запрос (например, ResultSet) для каждого оператора. Если два потока содержат один и тот же объект Connection, они, скорее всего, сразу же нарушат это правило.

Еще одно предостережение: при использовании пула соединений будьте очень осторожны и всегда закрывайте соединения, когда вы закончите. У диспетчера пула нет окончательного способа узнать, когда вы закончили с подключением, поэтому, если вы не сможете закрыть его, оно будет сидеть там висящее в течение длительного времени, возможно, навсегда, в зависимости от диспетчера пула. Я всегда всегда следую за каждым "getConnection" блоком try, и закройте соединение в блоке finally. Тогда Я ЗНАЮ, что закрыл его до выхода из функции.

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

7
ответ дан 5 December 2019 в 08:54
поделиться

Я думаю, вам следует начать с руководства Sun по пулу соединений. Помимо этого, существует множество реализаций пула соединений, некоторые с открытым исходным кодом, в том числе от Apache . Вам действительно стоит начать с этого, а не изобретать велосипед здесь.

2
ответ дан 5 December 2019 в 08:54
поделиться

Дополнительные биты:

  1. Сервер приложений, как правило, обеспечивает объединение соединений, и это может стать довольно умным. Если вы используете сервер приложений, внимательно изучите, что вы получаете из коробки, прежде чем добавлять что-либо свое.

  2. Транзакции: если у вас есть

    Начать транзакцию

    , получите соединение Работа закрыть соединение // означает возврат в пул

    получить соединение (с таким же уровнем изоляции и т. д.)
    // вы получите SAME соединение, пул резервирует его для вашей транзакции.

    работа // происходит в той же транзакции закрыть соединение

    Фиксация транзакции // фиксирует всю работу

  3. соединения и ошибки

Реализации пула могут быть умными. Если какое-либо соединение из пула испытывает определенные ошибки, которые указывают на отказ сервера БД, тогда пул может отказаться от всех участников пула.

0
ответ дан 5 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: