ฉันใช้ 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
import java.io.UnsupportedEncodingException
public คลาส ECov
{
สตริงคงที่สาธารณะ asc2gb (String asc) {
String ret;
if (asc==null) return asc;
ลอง
{
ret = new String (asc.getBytes ("ISO8859_1"), "GB2312")
;
e ){
ret=asc;
}
return ret;
}
สตริง
คง
ที่สาธารณะ gb2asc
("GB2312")
,
" ISO8859_1");
}
catch(UnsupportedEncodingException e){
ret=gb;
}
คง
ที่ int byte2int(byte b){
return
(-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 แบบธรรมดา