memori yang dialokasikan oleh driver jdbc untuk hasil fungsi pl/sql

Menurut dokumen "Oracle JDBC Memory Management" driver Oracle jdbc mengalokasikan char[] buffer ketika pernyataan diurai.

Ukuran buffer dihitung berdasarkan ukuran maksimum yang mungkin untuk data baris yang dikembalikan oleh kueri.
Misalnya untuk pernyataan SELECT NAME FROM TAB di mana NAME adalah VARCHAR2(40), 40 *2 byte = 80 byte akan dialokasikan.

Seberapa besar buffernya jika data baris merupakan fungsi dengan return varchar2? Misalnya:

select FOO from dual;

di mana FOO berada

create or replace function FOO
return varchar2 is
...

person zxeka    schedule 02.03.2012    source sumber
comment
Saya tidak yakin, tetapi jika dokumen mengatakan bahwa jdbc akan mengalokasikan hasil semaksimal mungkin, dalam hal ini adalah 32767 (maks dalam PL/SQL).   -  person    schedule 02.03.2012


Jawaban (2)


Saya membuat sebuah fungsi

CREATE FUNCTION TEMP_ADAM_FUNC RETURN VARCHAR2 IS
BEGIN
  RETURN 'TEST';
END;

Dan saya menanyakannya sebagai berikut:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT TEMP_ADAM_FUNC FROM DUAL");
results.next();
results.getString(1);

Setelah menjalankan ini melalui debugger, Anda dapat melihat bahwa driver telah mengalokasikan sejumlah besar memori:

masukkan deskripsi gambar di sini

Faktanya, driver telah mengalokasikan 65535 karakter untuk kolom VARCHAR2.

Saya menjalankan pertanyaan lain:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT DUMMY FROM DUAL");
results.next();
results.getString(1);

Saya mengonfirmasi ukuran kolom DUMMY menggunakan kueri ini:

SELECT
  DATA_TYPE,
  DATA_LENGTH
FROM
  ALL_TAB_COLUMNS
WHERE
  TABLE_NAME = 'DUAL' AND COLUMN_NAME = 'DUMMY'

Kueri ini masing-masing menghasilkan 'VARCHAR2' dan 1.

Namun, dalam kasus ini, driver mengalokasikan 4096 karakter:

masukkan deskripsi gambar di sini

Saya tidak begitu yakin apa yang mengatur logika ini.

person Adam Paynter    schedule 02.03.2012

Sedikit menyimpang dari pertanyaan Anda...

Seperti yang disebutkan di halaman 5 kertas putih yang Anda tautkan, jika Anda dapat menggunakan OracleStatement maka Anda dapat menggunakan defineColumnType untuk membatasi ukuran, dan juga jumlah memori yang dicadangkan untuk sebuah kolom.

Jadi Anda bisa menentukan ukuran yang lebih kecil dari default ketika ukurannya tidak tetap seperti pada pemanggilan fungsi Anda, atau jika Anda mengembalikan kursor ref; yang dapat menghemat sejumlah besar memori (karena Anda mungkin mendapatkan 32k - atau bahkan lebih berdasarkan penyelidikan Adam - dikalikan dengan jumlah baris yang Anda ambil sebelumnya). Anda juga dapat menentukan ukuran kolom yang Anda ketahui ukurannya, yang dapat menghemat perjalanan ke DB agar kolom tersebut dapat dicari saat pernyataan disiapkan. Dalam kedua kasus tersebut, jika Anda menetapkan angka terlalu rendah dan mengambil kolom dengan nilai lebih panjang dari yang diizinkan, Anda akan mendapatkan kesalahan.

person Alex Poole    schedule 02.03.2012