La solution la plus efficiente pour la lecture CLOB à la Chaîne, et la Chaîne de CLOB en Java?
J'ai un gros CLOB (plus de 32 ko) que je veux lire une Chaîne de caractères, à l'aide de StringBuilder. Comment puis-je le faire de la manière la plus efficace? Je ne peux pas utiliser la fonction "int longueur" constructeur de StringBuilder depuis la longueur de mon CLOB est plus qu'un "int" et a besoin d'un "long" de la valeur.
Je ne suis pas à l'aise avec Java I/O classes, et aimerais obtenir des conseils.
Modifier - j'ai essayé avec ce code pour clobToString():
private String clobToString(Clob data) {
StringBuilder sb = new StringBuilder();
try {
Reader reader = data.getCharacterStream();
BufferedReader br = new BufferedReader(reader);
String line;
while(null != (line = br.readLine())) {
sb.append(line);
}
br.close();
} catch (SQLException e) {
//handle this exception
} catch (IOException e) {
//handle this exception
}
return sb.toString();
}
- Qu'est-ce exactement que vous voulez faire une fois que vous lisez le CLOB dans une Chaîne de caractères?
- Voulez-vous dire CLOB dans la base de données des sens, ou tout simplement "grande chaîne"?
- Oui, c'est un CLOB à partir d'une base de données DB2 base.
- Le CLOB contient un grand XML-chaîne qui sera transmise à JAXB.
- Je me demande s'il est utile de classes en Java NIO pour cela.
- J'ai trouvé quelques infos utiles sur CLOB dans ce document: java.sun.com/j2se/1.5.0/docs/guide/jdbc/clob.html Mais je ne comprends pas l'utilisation de .getSubString(1,len), depuis len est un long et pas un int.
- Vous dites que la taille de votre CLOB est plus gros qu'un
int
pouvez stocker - que 4GO de données de chaîne. Êtes-vous sûr de cela? - Non, pas encore, mais j'ai un sentiment de ce genre de problèmes, je peux obtenir de cela, donc je vais faire quelques tests supplémentaires. J'ai eu de bons conseils ici, merci.
- "plus de 32 ko" - Vous voulez dire 32 bits?
Vous devez vous connecter pour publier un commentaire.
Si le CLOB longueur est plus grande que celui qui entre dans un int, les données CLOB ne rentre pas dans une Chaîne de caractères soit. Vous aurez à utiliser un streaming approche pour traiter cette quantité de données XML.
Si la longueur réelle de la CLOB est plus petit que
Integer.MAX_VALUE
, juste à la force de lalong
àint
en mettant(int)
en face d'elle.Ok je vais supposer un usage général, vous devez d'abord télécharger apache commons, vous y trouverez une classe utilitaire nommé IOUtils qui a une méthode nommée copie();
Maintenant la solution est: le flux d'entrée de votre CLOB objet à l'aide de getAsciiStream() et de le passer à la copie() la méthode.
InputStream
àReader
etclobObject.getAsciiStream()
àclobObject.getCharacterStream()
pour prévenir les problèmes de codage.Ma réponse est juste un goût de le même. Mais je l'ai testé avec de la sérialisation d'un zippé contenu et cela a fonctionné. Donc, je peux faire confiance à cette solution, contrairement à celui de la première (qui utilisent readLine), parce qu'il ignore les sauts de ligne et la corruption de l'entrée.
Quel est le problème avec:
?
Par exemple Oracle
oracle.sql.CLOB
effectuegetSubString()
internechar[]
qui sont définis dans leoracle.jdbc.driver.T4CConnection
et justeSystem.arraycopy()
et à côté d'une pelliculeString
... Vous ne jamais obtenir une lecture plus rapide queSystem.arraycopy()
.Mise à JOUR Obtenir pilote ojdbc6.jar, et décompiler
CLOB
mise en œuvre, et de l'étude de cas serait plus rapide basé sur les éléments internes de la connaissance.ojdbc6.jar
.Integer.MAX_VALUE
est une limite pour la longueur du tableau de JDK Plate-forme 2 et de la Chaîne de tenir des caractères dans le tableau. Si vous avez de la chance pour > 2 GiB CLOBs... Essayez streaming approche parce que vous ne pouvez pas tenir que de données avec Java pur modèle de mémoire (sauf si vous utilisez une extension native et de la plate-forme 64 bits avec assez de mémoire système).Si vous devez vraiment utiliser uniquement des bibliothèques standard, alors vous avez juste à développer Omar solution un peu. (Apache IOUtils est fondamentalement juste un ensemble de méthodes pratiques qui économise beaucoup de codage)
Vous êtes déjà en mesure d'obtenir le flux d'entrée par le biais de
clobObject.getAsciiStream()
Vous avez juste à "transférer manuellement" les personnages de la StringWriter:
Garder à l'esprit que
getAsciiStream()
forces de codage ASCII et corrompt tous les non-ASCII des caractères. Ce que vous faites est d'obtenir unInputStream
(octets) à partir d'un personnage de la source, puis immédiatement retourner dans les caractères à l'aide d'un hasard de plate-forme (par défaut) le codage deInputStreamReader
. C'est une opération redondante, sauf pour le fait qu'il corrompt les données non-ASCII. Juste lire legetCharacterStream()
Reader
directement et écrire à laStringWriter
.Si l'aide de Mule, ci-dessous sont les étapes.
Suivez les étapes ci-dessous.
Activer la diffusion en continu dans le connecteur, c'est à dire progressiveStreaming=2
Transtypage de DB2 retourné CLOB à java.sql.Clob (IBM prend en charge ce type de fonte)
Convertir flux de caractères (ASCII flux peuvent parfois pas en charge certains caractères spéciaux). Donc, vous pouvez utiliser getCharacterStream()
Qui va renvoyer un "lecteur" de l'objet qui peut être converti à la "Chaîne" à l'aide de communes-io (IOUtils).
Donc, en bref, utiliser groovy composant et ajouter le code ci-dessous.
Remarque: Ici, je suppose que la "charge utile.champ1" est tenue de données clob.
Que c'est!
Ce Qui Concerne Naveen
L'approche ci-dessus est également très efficace.
D'une aide amicale de la méthode à l'aide d'apache commons.io
CLOB sont comme des Fichiers, vous pouvez lire des pièces de il facilement
et vous pouvez écraser comme cela
Je vous suggère de ne pas utiliser StringBuilder et le remplir jusqu'à ce que vous obtenez une Exception, presque comme l'ajout de numéros à l'aveuglette jusqu'à ce que vous obtenez un dépassement de capacité. Clob, c'est comme un fichier texte et de la meilleure façon de lire c'est à l'aide d'un tampon, dans le cas où vous avez besoin de traiter, sinon vous pouvez les lire dans un fichier local, comme ce