Oracle中JDBC对BLOB和CLOB读取的专用处理和通用处理
设有表: createtableblobimg(idintprimarykey,contentsblob); 一、BLOB入库的专用访问: 1)最常见于Oracle的JDBC示例中 一般是先通过select...forupdate锁定blob列,然后写入blob值,然后提交。要用到特定的OracleBLOB类。 Class.forName(oracle.jdbc.drive
设有表:
create table blobimg (id int primary key, contents blob);
一、BLOB入库的专用访问:
1) 最常见于Oracle的JDBC示例中
一般是先通过select ... for update锁定blob列,然后写入blob值,然后提交。要用到特定的Oracle BLOB类。
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");
//处理事务
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一个空对象
st.executeUpdate("insert into BLOBIMG values(1,empty_blob())");
//用for update方式锁定数据行
ResultSet rs = st.executeQuery(
"select contents from BLOBIMG where id=1 for update");
if (rs.next()) {
//使用oracle.sql.BLOB类,没办法了,变成专用的了
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(1).;
//到数据库的输出流
OutputStream outStream = blob.getBinaryOutputStream();
//这里用一个文件模拟输入流
File file = new File("d://proxy.txt");
InputStream fin = new FileInputStream(file);
//将输入流写到输出流
byte[] b = new byte[blob.getBufferSize()];
int len = 0;
while ( (len = fin.read(b)) != -1) {
outStream.write(b, 0, len);
}
//依次关闭
fin.close();
outStream.flush();
outStream.close();
}
con.commit();
con.close();
2) 再厉害一点的,是通过调用DBMS_LOB包中的一些函数来处理,效率好像也不错.
不过,要使用到存储过程,用到专用类OracleCallableStatement。
例:
import java.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import oracle.sql.*;
class TestBlobWriteByDBMS_LOB {
public static void main (String args []) throws SQLException ,
FileNotFoundException, IOException
{
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ora92","scott","tiger");
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
stmt.execute( "delete from demo" );
System.out.println( "deleted from demo" );
stmt.execute( "insert into demo (id,theBlob) values (s_enr.nextval,empty_blob())" );
conn.commit();
System.out.println( "committed" );
ResultSet rset = stmt.executeQuery ("SELECT theBlob FROM demo where id = s_enr.currval FOR UPDATE");
System.out.println( "Executed Query" );
if(rset.next())
{
System.out.println( "Fetched row " );
BLOB l_mapBLOB = ((OracleResultSet)rset).getBLOB(1);
File binaryFile = new File("e://free//jo.jpg");
FileInputStream instream=new FileInputStream(binaryFile);
int chunk = 32000;
System.out.println( "Chunk = "+ chunk );
byte[] l_buffer = new byte[chunk];
int l_nread = 0;
OracleCallableStatement cstmt =
(OracleCallableStatement)conn.prepareCall( "begin dbms_lob.writeappend( :1, :2, :3 ); end;" );
cstmt.registerOutParameter( 1, OracleTypes.BLOB );
while ((l_nread= instream.read(l_buffer)) != -1)
{
cstmt.setBLOB( 1, l_mapBLOB );
cstmt.setInt( 2, l_nread );
cstmt.setBytes( 3, l_buffer );
cstmt.executeUpdate();
l_mapBLOB = cstmt.getBLOB(1);
}
instream.close();
conn.commit();
rset.close();
stmt.close();
conn.close();
}
}
}
二、BLOB值读取的通用处理:
这个jdbc标准接口可以直接调用,因此比较简单,如下所示:
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select contents from BLOBIMG where id=1");
if (rs.next()) {
java.sql.Blob blob = rs.getBlob(1);
InputStream ins = blob.getBinaryStream();
//输出到文件
File file = new File("d://output.txt");
OutputStream fout = new FileOutputStream(file);
//下面将BLOB数据写入文件
byte[] b = new byte[1024];
int len = 0;
while ( (len = ins.read(b)) != -1) {
fout.write(b, 0, len);
}
//依次关闭
fout.close();
ins.close();
}
con.commit();
con.close();
三、BLOB值写入的通用处理:
这时要借助于PreparedStatement的动态绑定功能,借用其setObject()方法插入字节流到BLOB字段。
public void insertFile(File f) throws Exception{
FileInputStream fis=new FileInputStream(f,Connection conn);
byte[] buffer=new byte[1024];
data=null;
int sept=0;int len=0;
while((sept=fis.read(buffer))!=-1){
if(data==null){
len=sept;
data=buffer;
}else{
byte[] temp;
int tempLength;
tempLength=len+sept;
temp=new byte[tempLength];
System.arraycopy(data,0,temp,0,len);
System.arraycopy(buffer,0,temp,len,sept);
data=temp;
len=tempLength;
}
if(len!=data.length()){
byte temp=new byte[len];
System.arraycopy(data,0,temp,0,len);
data=temp;
}
}
String sql="insert into fileData (filename,blobData) value(?,?)";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,f.getName());
ps.setObject(2,data);
ps.executeUpdate();
}
四. CLOB读取的通用处理
public static String getClobString(ResultSet rs, int col) {
try {
Clob c=resultSet.getClob(2);
Reader reader=c.getCharacterStream():
if (reader == null) {
return null;
}
StringBuffer sb = new StringBuffer();
char[] charbuf = new char[4096];
for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) {
sb.append(charbuf, 0, i);
}
return sb.toString();
} catch (Exception e) {
return "";
}
}
当然还可以直接编写BLOB存取的存储过程供JDBC调用,那也非常方便。不过可能要用到外部LOB类型。这将在后边陆续进行介绍。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









Oracle 데이터베이스 로그의 보존 기간은 다음을 포함한 로그 유형 및 구성에 따라 다릅니다. 재실행 로그: "LOG_ARCHIVE_DEST" 매개변수로 구성된 최대 크기에 의해 결정됩니다. 보관된 리두 로그: "DB_RECOVERY_FILE_DEST_SIZE" 매개변수로 구성된 최대 크기에 따라 결정됩니다. 온라인 리두 로그: 보관되지 않고 데이터베이스를 다시 시작하면 손실되며 보존 기간은 인스턴스 실행 시간과 일치합니다. 감사 로그: "AUDIT_TRAIL" 매개변수로 구성되며 기본적으로 30일 동안 보관됩니다.

Oracle 데이터베이스 시작 순서는 다음과 같습니다. 1. 전제 조건을 확인합니다. 3. 데이터베이스 인스턴스를 시작합니다. 5. 데이터베이스에 연결합니다. . 서비스를 활성화합니다(필요한 경우). 8. 연결을 테스트합니다.

Oracle에 필요한 메모리 양은 데이터베이스 크기, 활동 수준 및 필요한 성능 수준(데이터 버퍼 저장, 인덱스 버퍼, SQL 문 실행 및 데이터 사전 캐시 관리에 필요)에 따라 다릅니다. 정확한 양은 데이터베이스 크기, 활동 수준 및 필요한 성능 수준에 따라 달라집니다. 모범 사례에는 적절한 SGA 크기 설정, SGA 구성 요소 크기 조정, AMM 사용 및 메모리 사용량 모니터링이 포함됩니다.

Oracle에서 문자 발생 횟수를 찾으려면 다음 단계를 수행하십시오. 문자열의 전체 길이를 얻습니다. 문자가 나타나는 부분 문자열의 길이를 얻습니다. 부분 문자열 길이를 빼서 문자 발생 횟수를 계산합니다. 전체 길이에서.

Oracle 데이터베이스 서버 하드웨어 구성 요구 사항: 프로세서: 기본 주파수가 2.5GHz 이상인 멀티 코어, 대규모 데이터베이스의 경우 32개 이상의 코어가 권장됩니다. 메모리: 소규모 데이터베이스의 경우 최소 8GB, 중간 크기의 경우 16~64GB, 대규모 데이터베이스 또는 과도한 작업 부하의 경우 최대 512GB 이상. 스토리지: SSD 또는 NVMe 디스크, 중복성 및 성능을 위한 RAID 어레이. 네트워크: 고속 네트워크(10GbE 이상), 전용 네트워크 카드, 지연 시간이 짧은 네트워크. 기타: 안정적인 전원 공급 장치, 이중 구성 요소, 호환 가능한 운영 체제 및 소프트웨어, 열 방출 및 냉각 시스템.

Oracle은 다음 단계를 통해 dbf 파일을 읽을 수 있습니다. 외부 테이블을 만들고 dbf 파일을 참조하여 데이터를 Oracle 테이블로 가져옵니다.

Oracle 데이터베이스에 필요한 메모리 양은 데이터베이스 크기, 작업 부하 유형 및 동시 사용자 수에 따라 다릅니다. 일반 권장 사항: 소형 데이터베이스: 16~32GB, 중형 데이터베이스: 32~64GB, 대형 데이터베이스: 64GB 이상. 고려해야 할 다른 요소로는 데이터베이스 버전, 메모리 최적화 옵션, 가상화 및 모범 사례(메모리 사용량 모니터링, 할당 조정)가 있습니다.

Oracle에서 하루에 한 번 실행되는 예약된 작업을 생성하려면 다음 세 단계를 수행해야 합니다. 작업을 생성합니다. 작업에 하위 작업을 추가하고 해당 일정 표현식을 "INTERVAL 1 DAY"로 설정합니다. 작업을 활성화합니다.
