使用spring后發(fā)現(xiàn)和oracle的驅(qū)動(dòng)有了不解之緣,最初是spring的jdbc存取oracle的clob字段,出現(xiàn) org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is java.sql.SQLException: Io 異常: Software caused connection abort: socket write error 問(wèn)了Juergen Hoeller幾次,也沒(méi)有知道原因所在。只有加入了hibernate解決此問(wèn)題,hibernate如何解決oracle的clob字段,看我以前的帖子(http://blogger.org.cn/blog/more.asp?name=hongrui&id=1171)。 后來(lái)看到agilejava也遇到這類問(wèn)題,原來(lái)是ojdbc14.jar驅(qū)動(dòng)的問(wèn)題,改為9.2.0.5.0,一切OK了。相關(guān)blog(http://agilejava.blogbus.com/logs/2005/02/1031034.html) 因?yàn)楝F(xiàn)在大量用到存儲(chǔ)過(guò)程,打算使用spring的StoredProcedure 進(jìn)行操作,發(fā)現(xiàn)運(yùn)行到SQLErrorCodes loaded: [DB2, HSQL, MS-SQL, MySQL, Oracle, Informix, PostgreSQL, Sybase] 就停了,沒(méi)有辦法,問(wèn)了Thomas Risberg,他說(shuō)程序沒(méi)有錯(cuò)誤,我當(dāng)時(shí)就暈了,后來(lái)聽說(shuō)虎子做過(guò)類似的工作,代碼給虎子看,也說(shuō)沒(méi)錯(cuò),而且在它那里運(yùn)行正常,我生氣了。聽從他的建議,加入spring源碼調(diào)試,也不知道問(wèn)題所在。認(rèn)為是數(shù)據(jù)庫(kù)的問(wèn)題,換了臺(tái)數(shù)據(jù)庫(kù)還是不行。最后把防火墻撤掉,讓虎子直接訪問(wèn)數(shù)據(jù)庫(kù),他那里一切正常。問(wèn)題明朗了,數(shù)據(jù)庫(kù)一樣的,代碼一樣的,唯一不同的是jdk和oracle驅(qū)動(dòng),他的jdk1.425,我得1.421,差別不大,那就是驅(qū)動(dòng)的問(wèn)題,我換了以前用的ojdbc14.jar,現(xiàn)在用的版本10.1.0.2.0,換到9.0.2.0.0,一切OK,此時(shí),我已經(jīng)出離憤怒了,建議oracle驅(qū)動(dòng)最好是自己命名,把文件名加上版本信息,要不會(huì)死人的。 下面是我作測(cè)試的PLSQL代碼 CREATE OR REPLACE package chapter_13 as TYPE rs IS REF CURSOR ; procedure founder(oFields out rs); end; /CREATE OR REPLACE package body chapter_13 as PROCEDURE founder(oFields out rs) IS BEGIN open oFields for select * from dept; END founder; end; java代碼 package springtest; import java.sql.*; import java.util.*; import javax.sql.*; import oracle.jdbc.driver.OracleTypes; import org.springframework.jdbc.core.*; import org.springframework.jdbc.datasource.*; import org.springframework.jdbc.object.*; public class TestDao { public static void main(String[] args) throws Exception { new TestDao().execute(); } public void execute() throws Exception { DataSource ds = new DriverManagerDataSource( "oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:mydb", "scott", "tiger"); DemoStoredProcedure proc = new DemoStoredProcedure(ds); Map params = new HashMap(); proc.execute(params); } private class DemoStoredProcedure extends StoredProcedure { public static final String SQL = "chapter_13.founder"; public DemoStoredProcedure(DataSource ds) { setDataSource(ds); setSql(SQL); setFunction(false); declareParameter( new SqlOutParameter( "obrief", OracleTypes.CURSOR, new RowMapper() { public Object mapRow(ResultSet rs, int rowNum) throws SQLException { System.out.println(rs.getString(1)); return rs.getString(1); } } )); compile(); } } |