JNI Utiliser une connection Java dans une dll C/C++ - Java - Programmation
Marsh Posté le 04-11-2002 à 14:01:47
et tu es sur que ca en vaut la peine?
Idée: modifier le programme C pour qu'il traite le resultset à ta place ... Mais bon pour la connection, ca m'étoonerait TRES fort. Et à y réfléchir c'est même impossible ...
Marsh Posté le 04-11-2002 à 14:03:41
DarkLord a écrit a écrit : et tu es sur que ca en vaut la peine? Idée: modifier le programme C pour qu'il traite le resultset à ta place ... Mais bon pour la connection, ca m'étoonerait TRES fort. Et à y réfléchir c'est même impossible ... |
Comment ça qu'il traite le ResultSet à ma place ?
Marsh Posté le 04-11-2002 à 14:06:54
bin qu'il te renvoie des données formatées (un tableau de brol ou que sais je). Mais oublie pour ta connection hein Utiliser une connection (qui je le rappelle est dépendante du driver Java de ta DB) Java dans un prog C j'ai du mal à imaginer que ce soit possible ...
Marsh Posté le 04-11-2002 à 14:13:02
Ms le problème c'est que cette Dll existe déja. Elle est actuellement utilisée dans des programmes C++.
Le but serait que ma web-app utilise aussi cette dll.
Ms cette dll, dans son fonctionnement "normal" utilise une connection Odbc pour aller chercher toutes sortes d'infos en BD dont elle à besoin en interne pour pouvoir faire son job.
J'ai pas compris les raisons que tu donnes à propos de l'inutilisabilité d'un objet Connection java pour récupérer des données dans un prog C++ via JNI...
Marsh Posté le 04-11-2002 à 14:19:12
bin Connection c'est une interface. Lorsque tu fais un forName de ton driver (oracle ou autre) il déclare l'api qui va etre utilsée pour accéder à la BD. Donc lorsque tu demandes une connection tu récupères une implémentation de Connection pour ta BD.
Conceptuellement parlant, je vois mal (mais je peux me tromper) comment ce genre d'objet pourrait etre utilisable par ta DLL. J'ose imaginer que JNI s'occupe de transformer les objets Java en truc compréhensible par ta DLL C++ ou un mécanisme du genre ...
Mais bon une connection JDBC, j'ai plus qu'un doute
Marsh Posté le 04-11-2002 à 14:25:21
Moi j'imaginait que les objetc Java restaient les même de toute façon, et que JNI permettait juste de "piloter" un objet passé en paramètre, en permettant d'utiliser ses méthodes et attributs publics.
J'éspère que j'me trompe pas. Si c le cas, qqch est possible...
Marsh Posté le 04-11-2002 à 14:33:40
El_Gringo a écrit a écrit : Bon, pour des raisons que j'ai pas bien le temps d'expliquer, voila ce que j'aurais besoin defaire : J'ai une appli Java qui à initialisé une connection JDBC. Cette appli Java utilisera JNI pour déléguer une partie du boulot qu'elle a à faire à une DLL écrite en C. Cette dll C doit absolument aller chercher elle même des données dans une base de données. D'ou ma question : - Est-il possible de passer en paramètre l'objet de type java.sql.Connection représentant ma connection Java ? (logiquement, oui) - Mais surtout, est ce que ça serait très lourd à gérer, nottament pour la récupération de données, comment exploiter un Statement, un ResultSet via JNI (dans la dll quoi !) ? Je rêve là ou pas ? C possible ça ? |
La réponse est oui aux 2 questions. Le truc, c'est que tu vas vite trouver cela très lourd à programmer. Par exemple, si tu as un objet Connection et que tu veux exécuter la méthode Statement createStatement(int resultSetType, int resultSetConcurrency), tu dois écrire :
Code :
|
Marsh Posté le 04-11-2002 à 14:48:35
>>> Désolé d'avoir induit en erreur. Je suis vraiment étonné de ce que JNI est capable de faire (meme si c'est lourd) ...
Marsh Posté le 04-11-2002 à 14:55:29
BifaceMcLeOD a écrit a écrit : La réponse est oui aux 2 questions. Le truc, c'est que tu vas vite trouver cela très lourd à programmer. Par exemple, si tu as un objet Connection et que tu veux exécuter la méthode Statement createStatement(int resultSetType, int resultSetConcurrency), tu dois écrire :
|
Génial...
Bon, j'vais m'y mettre à JNI alors.
Biface et les autres qui connaissent JNI, restez à portée de clavier, j'risque d'avoir besoin de vous
Merci...
Marsh Posté le 04-11-2002 à 14:56:57
DarkLord a écrit a écrit : >>> Désolé d'avoir induit en erreur. Je suis vraiment étonné de ce que JNI est capable de faire (meme si c'est lourd) ... |
Y a pas d'mal, ça peut arriver.
Juste, t'as la chance de pas avoir en face de toi qqn avec un caractère de chiotte qui en profite pour t'en mettre plein la tête !
Marsh Posté le 04-11-2002 à 16:45:57
BifaceMcLeOD a écrit a écrit : La réponse est oui aux 2 questions.... |
biface
Une remarque (pas pour toi biface, je sais que tu sais...), quand meme, c'est lourd a gerer, c'est sujet aux erreurs, c'est lent.
En general on reserve ce genre de callback pour des cas exceptionnels (creation d'une exception, logging d'un message...).
De plus ca ne va pas te remplacer directement ta connection ODBC.
Renaud
Marsh Posté le 05-11-2002 à 09:45:27
- Renaud - a écrit a écrit : biface Une remarque (pas pour toi biface, je sais que tu sais...), quand meme, c'est lourd a gerer, c'est sujet aux erreurs, c'est lent. En general on reserve ce genre de callback pour des cas exceptionnels (creation d'une exception, logging d'un message...). De plus ca ne va pas te remplacer directement ta connection ODBC. Renaud |
J'aurais peut être une disaine de requète à effectuer, maxi, chacune rendant un seul résultat. Tu crois que c beaucoup trop lourd ?
Comment ça ça remplacera pas ma connection ODBC ?
Je me doute bien que ça va pas marcher sans changer le code, ms si ça me permet d'exécuter des requêtes SQL et de Récupérer les résultats, ça remplace ma connection ODBC. Sinon j'vois pas l'intéret !
Marsh Posté le 05-11-2002 à 10:01:15
mais si tu as si peu de trucs pourquoi te casser la tête ca te prendra dix fois moins de temps de recoder ca en java que de jouer avec JNI avec ton truc tout fait ...
Enfin moi ce que j'en dit ...
Marsh Posté le 05-11-2002 à 10:04:44
DarkLord a raison. D'autant qu'après, le code JNI, il faut le maintenir, et de mon expérience, le coût de maintenance d'une ligne de JNI est 10 fois plus important que celui d'une ligne Java (c'est un ordre de grandeur), même s'il a été codé très proprement au départ (parce que si le programmeur a codé ça comme un porc, c'est 50 fois plus...).
Marsh Posté le 05-11-2002 à 10:51:08
Ben, y a relativement peu d'accès au BD, mais ceux-ci sont utilisés pour initialiser des objets qui, eux sont relativement complexes, et, à mon avis, pas si simple que ça à recoder.
D'autant plus qu'après avior été initialisés, ces objets sont utilisés dans un moteur graphique (ma dll) qui, lui, est carrément impossible à refaire en Java...
Marsh Posté le 05-11-2002 à 11:21:08
si les objets sont complexes et que tu veux les faire passer à ton prog java, ca va etre galère
Marsh Posté le 05-11-2002 à 12:32:56
DarkLord a écrit a écrit : si les objets sont complexes et que tu veux les faire passer à ton prog java, ca va etre galère |
Justement, j'éspère ne pas avoir à les passer à mon code Java.
Cette dll générère et utilise toute seule comme une grande ces objets complexes. Avec ceux-ci, elle me génére une image, dès lors toute simple à utiliser (forcément )
Moi seul pb (et surement pas des miondres), c'est que cette dll à besoin d'aller chercher 2, 3 trucs en BD...
Un peu trop nombreux qd même pour pouvoir tout lui passer en paramètres...
Marsh Posté le 05-11-2002 à 14:03:06
et pq pas. Moi je dis passage de paramètre powa
Marsh Posté le 05-11-2002 à 15:16:12
DarkLord a écrit a écrit : et pq pas. Moi je dis passage de paramètre powa |
T'as peut être raison, mais ça me fait chercher en bd des trucs peut être pas nécessaire...
Marsh Posté le 05-11-2002 à 15:17:19
il faut etre pragmatique parfois ...
Marsh Posté le 04-11-2002 à 13:59:27
Bon, pour des raisons que j'ai pas bien le temps d'expliquer, voila ce que j'aurais besoin defaire :
J'ai une appli Java qui à initialisé une connection JDBC.
Cette appli Java utilisera JNI pour déléguer une partie du boulot qu'elle a à faire à une DLL écrite en C. Cette dll C doit absolument aller chercher elle même des données dans une base de données. D'ou ma question :
- Est-il possible de passer en paramètre l'objet de type java.sql.Connection représentant ma connection Java ? (logiquement, oui)
- Mais surtout, est ce que ça serait très lourd à gérer, nottament pour la récupération de données, comment exploiter un Statement, un ResultSet via JNI (dans la dll quoi !) ?
Je rêve là ou pas ? C possible ça ?