หน่วยความจำที่จัดสรรโดยไดรเวอร์ jdbc สำหรับผลลัพธ์ของฟังก์ชัน pl/sql

ตามเอกสาร "Oracle JDBC Memory Management" ไดรเวอร์ Oracle jdbc จัดสรรบัฟเฟอร์ char[] เมื่อมีการแยกวิเคราะห์คำสั่ง

ขนาดบัฟเฟอร์จะถูกคำนวณตามขนาดสูงสุดที่เป็นไปได้สำหรับข้อมูลแถวที่ส่งคืนโดยการสืบค้น
ตัวอย่างเช่นสำหรับคำสั่ง SELECT NAME FROM TAB โดยที่ NAME คือ VARCHAR2(40), 40 *2 ไบต์ = 80 ไบต์จะถูกจัดสรร

บัฟเฟอร์จะมีขนาดใหญ่เพียงใดหากข้อมูลแถวเป็นฟังก์ชันที่มี return varchar2 ตัวอย่างเช่น:

select FOO from dual;

FOO อยู่ที่ไหน

create or replace function FOO
return varchar2 is
...

person zxeka    schedule 02.03.2012    source แหล่งที่มา
comment
ฉันไม่แน่ใจ แต่ถ้าเอกสารบอกว่า jdbc จะจัดสรรผลลัพธ์สูงสุดที่เป็นไปได้ ในกรณีนี้จะเป็น 32767 (สูงสุดใน PL/SQL)   -  person    schedule 02.03.2012


คำตอบ (2)


ฉันสร้างฟังก์ชั่น

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

และข้าพเจ้าก็สอบถามดังนี้

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

หลังจากรันสิ่งนี้ผ่านดีบักเกอร์ คุณจะเห็นว่าไดรเวอร์ได้จัดสรรหน่วยความจำจำนวนมาก:

ป้อนคำอธิบายรูปภาพที่นี่

อันที่จริงแล้ว คนขับได้จัดสรรอักขระ 65535 สำหรับคอลัมน์ VARCHAR2

ฉันเรียกใช้แบบสอบถามอื่น:

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

ฉันยืนยันขนาดของคอลัมน์ DUMMY โดยใช้แบบสอบถามนี้:

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

แบบสอบถามนี้ให้ผลเพิ่มขึ้น 'VARCHAR2' และ 1 ตามลำดับ

อย่างไรก็ตาม ในกรณีนี้ ไดรเวอร์จัดสรร 4096 อักขระ:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่แน่ใจนักว่าอะไรควบคุมตรรกะนี้

person Adam Paynter    schedule 02.03.2012

เบี่ยงเบนไปเล็กน้อยจากคำถามของคุณ ...

ตามที่กล่าวไว้ในหน้า 5 ของเอกสารไวท์เปเปอร์ที่คุณเชื่อมโยง หากคุณสามารถใช้ OracleStatement ได้ คุณสามารถใช้ defineColumnType เพื่อจำกัดขนาดและจำนวนหน่วยความจำที่สงวนไว้สำหรับคอลัมน์

ดังนั้นคุณจึงสามารถระบุขนาดที่เล็กกว่าค่าเริ่มต้นได้เมื่อขนาดไม่ได้รับการแก้ไขเหมือนกับในการเรียกใช้ฟังก์ชันของคุณ หรือหากคุณส่งคืนเคอร์เซอร์อ้างอิง ซึ่งอาจช่วยประหยัดหน่วยความจำได้มาก (เนื่องจากคุณอาจได้รับ 32,000 - หรือมากกว่านั้นจากการสืบสวนของอดัม - คูณด้วยจำนวนแถวที่คุณกำลังดึงข้อมูลล่วงหน้า) คุณยังสามารถระบุขนาดของคอลัมน์ที่คุณทราบขนาดของคอลัมน์ได้ ซึ่งสามารถบันทึกการเดินทางไปยัง tbe DB เพื่อให้คอลัมน์เหล่านั้นถูกค้นหาเมื่อเตรียมคำสั่ง ไม่ว่าในกรณีใด หากคุณตั้งค่าตัวเลขต่ำเกินไปและดึงข้อมูลคอลัมน์ที่มีค่ายาวเกินกว่าที่คุณอนุญาต คุณจะได้รับข้อผิดพลาด

person Alex Poole    schedule 02.03.2012