Avatar billede twm Nybegynder
25. maj 2004 - 14:46 Der 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 :)

Mvh
Twm
Avatar billede twm Nybegynder
25. maj 2004 - 14:51 #1
no_blob()=EMPTY_BLOB() ;)
Avatar billede twm Nybegynder
25. maj 2004 - 15:51 #3
Jeg har problemer i denne linje:
tempClob = CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION );

Hvor conn er fra en connection pool under tomcat :(
jeg får en classcastexception, den skulle være en OracleConnection
Avatar billede arne_v Ekspert
25. maj 2004 - 20:16 #4
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.


I have another idea that I need to check.
Avatar billede arne_v Ekspert
25. maj 2004 - 20:32 #5
Prøv følgende:

((org.apache.commons.dbcp.PoolingDataSource)ds).setAccessToUnderlyingConnectionAllowed(true);
Connection con = ds.getConnection();
OracleConnection con2 = (OracleConnection)((org.apache.commons.dbcp.DelegatingConnection)con).getInnermostDelegate();
Avatar billede arne_v Ekspert
25. maj 2004 - 20:32 #6
Det er ikke kønt, men ...
Avatar billede twm Nybegynder
26. maj 2004 - 07:37 #7
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.
Avatar billede twm Nybegynder
26. maj 2004 - 08:02 #8
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)
Avatar billede twm Nybegynder
26. maj 2004 - 09:08 #9
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!
Avatar billede arne_v Ekspert
26. maj 2004 - 09:13 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester