2009-09-25 3 views
1

Я использую sun.jdbc.odbc.JdbcOdbcDriver для подключения к базе данных oracle. Я знаю, что, вероятно, мне будет лучше использовать тонкий драйвер, но я хочу, чтобы приложение работало без указания имя сервера db и номер порта no.My, как jdbc: odbc: DSN.Как установить размер выборки для драйвера jdbc odbc

Запросы, которые я выполняю в своем приложении, могут возвращать миллионы строк. Все данные имеют решающее значение, поэтому я не могу ограничить их в запросе. Моя проблема заключается в том, что приложение java работает в памяти.

Когда я проверяю размер выборки в заявлении, он установлен на 1. Это кажется чрезвычайно субоптимальным (запрос, получающий 45K строк, занимает около 13 минут), и я хотел бы иметь размер выборки по крайней мере 500 с тем чтобы повысить производительность.

Я понимаю, что когда мой запрос выполняется (я использую Statement), объект оператора указывает на результаты в базе данных, которые я повторяю с помощью ResultSet. Результирующий набор попадет в базу данных, чтобы получить n no из строк (где n - размер выборки) каждый раз, когда я делаю resultSet.next(). Правильно ли это толкование? Если это так, это значит, что мое приложение будет никогда не сталкивается с проблемами памяти до тех пор, пока размер моей выборки не станет настолько большим, что JVM будет загружен?

Когда я создаю stmt.setFetchSize() после создания инструкции, я получаю недопустимый размер sql выборки sql. Я могу избежать этого исключения, если установить stmt.setMaxRows() на большее значение, чем размер выборки .Но
1. Я не хочу, чтобы мои результаты ограничивались значением MaxRows.
2. Пробовал задавать максимальные ряды до огромного значения и пытался с размером выборки 500, но не видел улучшения во времени.

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

Спасибо,
Fell

ответ

2

Я не использовал мост JDBC-ODBC через несколько лет, но я ожидал бы, что размер выборки драйвера ODBC будет контролироваться. Какой драйвер ODBC вы используете и какую версию драйвера ODBC используете? Каков размер выборки, указанный в DSN?

Как отдельный вопрос, я бы серьезно поставил под вопрос ваше решение использовать мост JDBC-ODBC в этот день и в возрасте. Драйвер JDBC может использовать псевдоним TNS, а не явно указывать хост и порт, которые не сложнее конфигурировать, чем DSN ODBC. И избавление от требования устанавливать, настраивать и поддерживать драйвер ODBC и DSN значительно улучшает производительность.

+0

спасибо большое! Я не знал о тонком драйвере с использованием псевдонимов TNS. Это решило все мои проблемы с unix. Есть ли способ извлечь имя сервера/экземпляра, указанное в конфигурации драйвера ODBC? – Fell

+0

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

+0

еще раз спасибо. Мое приложение работает отлично! – Fell

1

Использование JDBC. Преимущество использования моста ODBC не имеет. В PreparedStatement или CallableStatement вы можете вызвать setFetchSize(), чтобы ограничить размер набора строк.

1

Вы уверены, что размер выборки имеет значение для драйвера ODBC-JDBC от Sun? Мы попробовали это несколько лет назад с Java 5. Значение установлено, даже проверено, но никогда не используется. Я подозреваю, что это все еще так.