ฉันใช้ ORACLE9i และ Oracle8 มาเป็นเวลานาน ฉันได้เขียนปัญหาที่ต้องให้ความสนใจเมื่อใช้ JSP ที่นี่เพื่อใช้อ้างอิงเท่านั้น
1. วิธีจัดการกับ Clob และ BLOB ขนาดใหญ่
สามารถใช้ CLOB เพื่อจัดเก็บข้อมูลข้อความขนาดใหญ่และสามารถจัดเก็บข้อมูลได้มากถึง 4GB เป็นเรื่องปกติในการพัฒนาแอปพลิเคชัน คลาส sql.Clob ที่จัดทำโดย Java มัน มีสองวิธีในการอ่านรับข้อมูลของ Clob:
วิธีการ getCharacterStream() ส่งคืนสตรีมอินพุตที่เข้ารหัสแบบ unicode (วัตถุ java.io.Reader)
วิธีการ getAsciiStream() ส่งคืนสตรีมอินพุตที่เข้ารหัส ASCII (java. io.InputStream object)
ดังนั้นหากคุณมี หากคุณสามารถจัดเก็บอักขระภาษาจีนได้ คุณต้องใช้วิธีก่อนหน้า
ตอนนี้ขอยกตัวอย่างการใช้งานจริงและให้ฉันเรียนรู้วิธีใช้ CLOB ทีละขั้นตอน
ขั้นแรก ให้สร้างตารางที่มีฟิลด์ CLOB:
สร้างการทดสอบตาราง (id INTEGER, เนื้อหา clob);
ต่อไป เราจะแทรกบันทึกลงในตารางนี้ผ่าน JSP จากนั้นรับและแสดง
การดำเนินการแทรก:
ประเด็นต่อไปนี้ที่ควรทราบคือ:
1) ไม่สามารถแทรกข้อมูลประเภท Clob ได้โดยตรง และต้องระบุก่อนผ่านเมธอด Empty_clob() โดยจะจัดสรรตัวระบุตำแหน่ง (ในทำนองเดียวกัน ให้ใช้ฟังก์ชัน empty_blob() เพื่อจัดสรรตัวระบุตำแหน่งสำหรับ Blobs) จากนั้นเลือกมัน (แน่นอนว่าไม่มีข้อมูลในขณะนี้ แต่ชุดผลลัพธ์ไม่ว่างเปล่า) รับวัตถุ Clob และแก้ไขเนื้อหาของวัตถุทำให้ตรงตามความต้องการของเรา จากนั้นบันทึกแถวจะถูกอัปเดตผ่านวิธีการอัปเดต
2) เมื่อแก้ไขบันทึกที่มีประเภท lob ผ่านการเลือก แถวจะต้องถูกล็อค (ใช้งานผ่านคีย์เวิร์ดสำหรับการอัปเดต) มิฉะนั้น Oracle จะรายงานข้อผิดพลาด
3) หากเลือกบันทึกที่แทรกไว้สำหรับการอัปเดต ข้อผิดพลาด "การละเมิดลำดับการอ่าน" จะเกิดขึ้น วิธีแก้ไขคือการตั้งค่าอัตโนมัติ ฟังก์ชั่นการส่งเป็นเท็จนั่นคือไม่อนุญาตให้ส่งอัตโนมัติจากนั้นจึงเลือกมัน นี่คือฟังก์ชั่นข้างต้นของบรรทัด //* ในโค้ดนี้
ต่อไปเราจะอ่านบันทึกที่แทรกใหม่จาก ฐานข้อมูลและแสดงผล:
2. ปัญหาการเข้ารหัส
เนื่องจากผู้พัฒนา JAVA เป็นชาวต่างชาติ การรองรับภาษาจีนจึงไม่ค่อยดีนัก โอเค นี่ทำให้เราหลายคนปวดหัวมาก ซึ่งเรากำลังพูดถึงเกี่ยวกับตัวอักษรจีน การเข้ารหัส ฉันจะไม่ลงรายละเอียดเกี่ยวกับข้อกำหนดการเข้ารหัสอักขระภาษาจีนบางส่วน ฉันจะพูดถึงวิธีเชื่อมต่อกับฐานข้อมูล Oracle เป็นหลัก แต่ปัญหาเล็กๆ น้อยๆ เหล่านี้เป็นปัญหามาก
1. คำถามภาษาจีนที่แทรกลงในฐานข้อมูลจะต้องถูกแปลงเป็นการเข้ารหัส
2. การอ่านภาษาจีนจากฐานข้อมูลจะต้องถูกแปลงเป็นการเข้ารหัส
ให้เราดูโค้ด JAVA ที่เข้ารหัส:
//ECov.java นำเข้า java.io.UnsupportedEncodingException; ECov ชั้นเรียนสาธารณะ - สาธารณะสตริงคงที่ asc2gb (สตริง asc) { สตริงรี; ถ้า (asc==null) กลับ asc; พยายาม{ ret=new String(asc.getBytes("ISO8859_1"),"GB2312"); - จับ (UnsupportedEncodingException e){ เร็ต=ASC; - กลับ; - สาธารณะสตริงคงที่ gb2asc (สตริง gb) { สตริงรี; ถ้า (gb==null) กลับ gb; พยายาม{ ret=new String(gb.getBytes("GB2312"),"ISO8859_1"); - จับ (UnsupportedEncodingException e){ ret=gb; - กลับ; - int สาธารณะคงที่ byte2int (ไบต์ b) { กลับ ((-1) >>>>>24)&b; - - |
ที่จริงแล้ว ความหมายของโค้ดนี้คือการรวมทั้งสองวิธีเข้าด้วยกัน
ควรใช้ ECov.gb2asc(arg) เมื่อแทรกลงในฐานข้อมูล และควรใช้ ECov.asc2gb(arg) เมื่ออ่าน จุดสำคัญที่สุดคือ Oracle ดูเหมือนจะรับรู้เฉพาะการเข้ารหัสรูปแบบ ISO8859_1 เท่านั้น (เป็นเพียงความคิดของฉัน)
3. รายละเอียดเล็กๆ น้อยๆ
1. มันคือ setAutoCommit(true หรือ false) ซึ่งเป็นฟังก์ชัน commit() ที่ใช้กันทั่วไปใน sqlPlus หากคุณใช้ true อย่าใช้ commit() มิฉะนั้น คุณจะยังคงใช้วิธี commit() .
2. จริงๆ แล้วการประมวลผลประเภทวันที่ไม่ได้ง่ายเหมือน setDate() และ getDate() อย่างที่คิด มีช่องโหว่ขนาดใหญ่อยู่ตรงกลาง คุณจะพบว่ามันสนุกมากหากคุณทำการดีบั๊กด้วยตัวเอง
3. วิธีที่ดีที่สุดคือใช้เทคโนโลยีพูลการเชื่อมต่อในฐานข้อมูล เป็นวิธีที่ดีในการใช้สภาพแวดล้อม J2EE มาตรฐานและเทคโนโลยี JNDI แบบธรรมดา