25. maj 2004 - 14:46Der er
9 kommentarer og 1 løsning
Clob felter mod Oracle
Hej Jeg har problemer med at skrive mere end 4Kbytes ned i et clob felt i en Oracle database. Jeg har prøvet følgende kode: StringReader reader = new StringReader(theString); ps.setCharacterStream(i,reader, theString.length());
Men når den når ud over de 4K mister den forbindelsen til databasen.
Jeg ved at man under insert kan lave en no_blob() i SQL sætningen, og så hente den ud i en select, for derefter at udføre en update, men det er ikke en særlig pæn måde, og er ikke umiddelbart en option i det projekt jeg koder.
Så mit spørgsmål lyder, hvordan får jeg udfyldt et Clob felt uden først at skulle lave en select?
Jeg bruger forresten Oracle Thin Driver! (Jeg er vel ikke den første der har brug for at gemme felter størrere end 4K :)
Ah ja - connection poolen returnerer jo en delegating connection.
En oplagt mulighed var at lave en gammeldags connection til at at indsætte CLOB's med. Connection pool er for high load. And hopefully INSERT CLOB is not many per second.
Jeg får classcastexception på: ((org.apache.commons.dbcp.PoolingDataSource)ds).setAccessToUnderlyingConnectionAllowed(true);
Jeg checkede type og ændrede den til org.apache.commons.dbcp.BasicDataSource: ((org.apache.commons.dbcp.BasicDataSource)ds).setAccessToUnderlyingConnectionAllowed(true);
Men jeg får stadig ClassCastException.
Jeg prøvede også dette tidligere for at omgå at skulle caste den: Class connectionClass = conn.getClass(); Method method = connectionClass.getMethod("getDelegate", null); Connection oConn = (Connection)method.invoke(conn, null); tempClob=CLOB.createTemporary(oConn, true, CLOB.DURATION_SESSION);
Men fik også classcast i den sidste linje i nogle underliggende metoder i oracle api'et, selvom jeg kunne se det var en OracleConnection. Det virker som om de kører i hvert deres memoryspace. Jeg lavede et par tests i Eclipse under expressions: ps instanceof org.apache.commons.dbcp.DelegatingPreparedStatement Resultat: false ps.getClass().getName().equals("org.apache.commons.dbcp.DelegatingPreparedStatement") Resultat: true
Som du skriver tidligere vil jeg helst undgå almindelige connections, da det giver ekstra administration.
Jeg har prøvet at ændre setAccessToUnderlyingConnectionAllowed(true); ved hjælp af debugger i eclipse, jeg får så igen samme fejl som med min egen kode: null java.lang.ClassCastException at oracle.jdbc.driver.OracleConnection.physicalConnectionWithin(OracleConnection.java:5126) at oracle.sql.CLOB.createTemporary(CLOB.java:1009) at oracle.sql.CLOB.createTemporary(CLOB.java:956) at com.twm.product.DAOHelper.getCLOB(DAOHelper.java:720)
Denne her manglede i server.xml, så virkede det hele: <parameter> <name>factory</name> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter>
Smider du et svar, så accepterer jeg? Tusind tak for hjælpen!
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.