Wednesday, December 22, 2004

One reason to switch to Java 1.5

คือ เมื่อทำการ POST ข้อมูลไปให้เว็บเซิร์ฟเวอร์โดยใช้คลาส HttpURLConnection คลาสนี้จะทำการเก็บข้อมูลทั้งหมดใส่ Buffer เอาไว้ก่อน ไม่ Post ออกไปทันทีเลย ทำนองต้องรู้ก่อนว่าขนาดข้อมูลมีเท่าไร จะได้เขียน "Content-Length" ตรงหัวได้ถูกต้อง

ปัญหาคือเมื่อ POST ไฟล์โตๆ เช่น มากกว่า 30MB หน่วยความจำที่ JavaVM ใช้ได้อาจจะไม่พอ และได้ "OutOfMemoryError" ออกมา

อาจแก้โดยเรียก "java -Xmx..." เอาได้ แต่ไม่สะดวกนักโดยเฉพาะเมื่อทำเป็น Applet ให้ชาวบ้านใช้ (ต้องไปตั้งค่าหน่วยความจำ Java Plugin ใน Control Panel กันวุ่นวาย)

ใน Java 1.5 คลาส HttpURLConnection จะมี StreamingMode ให้ใช้ (ไม่ทำการ Buffer) โดยสามารถบอกขนาด Content-Length ล่วงหน้าได้โดย เรียก setFixedLengthStreamingMode()

ดูเหมือน Java 1.4 จะทำไม่ได้จริงๆ ยังแปลกใจไม่มีใครใช้ Java 1.4 POST ข้อมูลโตๆแล้วเจอปัญหาบ้างเลยเหรอ มีคนสงสัยแบบนี้เหมือนกัน เขาบอกให้ไปใช้คลาสอื่นจาก Apache Jakarta แทน

Preventing URLConnection from buffering entire output stream

ตกลงเลิกใช้ HttpURLConnection แล้วไปเขียนข้อมูลใน TCP Socket ตรงๆเลย เอาคลาส TCPConnection ที่เคยทำไว้สำหรับ PantipPost มาใช้

No comments: