10k的时候运行结果是什么??详细结果!!
你把
pstmt1.setBinaryStream(1, fis, (int) csvfilepath.length());
改为
pstmt1.setBinaryStream(1, fis, (int) fis.available());
试试
你把
pstmt1.setBinaryStream(1, fis, (int) csvfilepath.length());
改为
pstmt1.setBinaryStream(1, fis, (int) fis.available());
试试
10k的时候,正常插入,没有报异常,并且,我测量这个blob的长度,没有丢失数据,当我插入稍大一点的时候就抛出了异常,但是还是做了插入操作,但是这个blob的长度为0.如果手头上装了oracle,可是试试。另外,我对抛出的异常“套节字”不是很熟悉。请指教。
抛出同样的错误。
读之前:52797
连接数据库......
读之后:52797
java.sql.SQLException: Io 异常: Connection reset by peer: socket write error
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.ja
va)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.jav
a)
at oracle.jdbc.driver.OracleStatement.doExecuteWithBatch(OracleStatement
.java)
at oracle.jdbc.driver.OracleStatement.doExecute(OracleStatement.java)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStateme
nt.java)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePrepar
edStatement.java)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStat
ement.java)
at Test.main(Test.java:40)
这是我操做成功的代码:
import java.sql.*;
import java.io.*;
import java.util.jar.*;
import java.util.Enumeration;
import java.util.zip.*;class JdbcCon{
String ur ="jdbc:oracle:thin:@192.168.201.200:1521:sdycdev";
String usr = "sdycdevuser";
public Connection getCon() throws SQLException{
System.out.println("连接数据库。");
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Connection db_con = DriverManager.getConnection(ur,usr,usr);
return db_con;
}
}
class Test{
public static void main(String[] arg) throws SQLException{
try{
StringBuffer tokenSet = new StringBuffer();
String csvfilepath=new String("G:\\zip.zip");
addOracleAuthor("12",csvfilepath);
}catch(Exception ee){}
}
public static void addOracleAuthor(String name, String file_photo) { Connection con = null;
Statement stmt = null;
PreparedStatement pstmt=null;
//File file = null;
InputStream photoFileStream = null;
try {
JdbcCon xx=new JdbcCon();
con = xx.getCon(); //得到Oracle数据库连接
System.out.println("连接成功!");
con.setAutoCommit(false); //注意:要设置为非自动提交的
//首先执行Insert语句插入一个空的Blob对象
String insert_sql = "Insert INTO test VALUES(EMPTY_BLOB(),'" + name + "' )";
stmt = con.createStatement();
stmt.executeUpdate( insert_sql ); //执行查询语句取出此记录的Blob对象,注:以UPDATE方式取出
//String sql = "select filetest from test where name='" + name + "' FOR UPDATE";
String sql = "select filetest from test where name=? FOR UPDATE";
pstmt=con.prepareStatement(sql);
pstmt.setString(1,name);
System.out.println("Execute SQL : " + sql);
//ResultSet rs = stmt.executeQuery(sql);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
//得到Blob的二进制对象输出流
Blob photoBlob = rs.getBlob(1);
OutputStream blob_out = ((oracle.sql.BLOB) photoBlob).getBinaryOutputStream(); //打开图像文件,获得文件输入流
File photoFile = new File(file_photo);
photoFileStream = new FileInputStream(photoFile); //从文件流中读取二进制然后写入Blob的输出流
byte[] buffer = new byte[10 * 1024]; //设置为10K大小,可能会有关系?未试
int nread = 0; // Number of bytes read
while ((nread = photoFileStream.read(buffer)) != -1) // Read from file
blob_out.write(buffer, 0, nread); // Write to Blob // 关闭文件流和Blob对象流
photoFileStream.close();
blob_out.close();
} //提交数据库连接
con.commit();
System.out.println("结束");
} catch (Exception e) {
try{ con.rollback();}catch(Exception e2 ){} //回滚
e.printStackTrace();
} finally {
try {
if (photoFileStream != null) photoFileStream.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (stmt != null) stmt.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
try {
if (con != null) con.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}}