JNDI et javax.sql.Source de données
Je suis quelqu'un que l'habitude de faire de J2EE de codage dans le passé et je suis de retour dans le giron de travailler sur un nouveau projet J2EE. Beaucoup de choses ont changé depuis 2001, j'ai donc besoin de poser cette question très simple.
Je suis en utilisant la syntaxe comme ça dans ma classe de base de données:
@Resource(name = "jdbc/MyDatabase")
private javax.sql.DataSource dataSource;
Je comprends que c'est une nouvelle fonctionnalité (annotations), mais je ne suis pas vraiment sûr de savoir comment il fonctionne. Plus tard, dans ma classe, je fais cet appel:
Connection c = dataSource.getConnection();
Et il jette un NullPointerException à chaque fois. J'ai pas ça dans le débogueur et comme il s'avère, à la source de données EST nulle.
Il semble magique et étrange que je n'initialisez pas moi-même source de données dans le code. Toute idée de ce que je fais mal?
Mon web.xml contient le bloc suivant pour établir la ressource:
<resource-env-ref>
<resource-env-ref-name>jdbc/MyDatabase</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
Et j'ai ajouté à mon Contexte à l'aide d'un context.xml fichier META-INF. Le Contexte de l'entrée ressemble à:
<Resource name="jdbc/MyDatabase" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="username" password="password" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/mydb?autoReconnect=true"/>
Je suis en utilisant Tomcat 6, MySQL 5, le dernier pilote MySQL (pas les anciennes v3 mais la nouvelle v5 pilote).
Mise à jour: Ce n'est pas de travail pour moi car je l'utilise dans une plaine vieux de la classe. J'ai créé un nouveau projet et de l'ajout d'une servlet. La source de données est non-nulle dans la servlet.
OriginalL'auteur the0ther | 2009-11-09
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin au moins d'avoir de la suite dans les appserver de
/conf/context.xml
ou la la webapplication de/META-INF/context.xml
fichier:Voir aussi http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html
Et dans la webapp est
/WEB-INF/web.xml
vous devez définir les éléments suivants:Modifier: je vois maintenant que vous avez édité votre post pour ajouter le codage. Je vois aussi que vous avez utilisé
resource-ref
au lieu deresource-env-ref
. Le premier fait référence à une ressource externe (lire: pas webcontainer-géré), et le deuxième se réfère à l'interne (de l'environnement) ressource (lire: webcontainer-géré). Le remplacer et voir.Désolé j'ai confondu l'annotation, vous avez réellement besoin pour définir la ressource dans le web.xml. Vous avez seulement besoin de la définir comme
<resource-env-ref>
à la place. Message édité.tous mes db code est enterré dans une couche de la mise en œuvre de la vieille école de type pooling de connexion...un Singleton DbPool classe sans constructeur public. que peut-être ce qui me fait mal. je vais le taquiner tout en dehors et essayer un de bare-bones coup. à quel moment le privé DataSource dataSource champ devenir initialisé à quelque chose de non-nulle? est-ce grave si je l'utiliser dans une classe sans constructeur privé? ne que membre de l'initialisée automatiquement la première fois qu'un constructeur est appelé?
Peut-être que le
@Resource
annotation ne fonctionne pas correctement. Il devrait être responsable de l'obtention de laDataSource
à partir de la JNDI et de l'affecter à la variable. Cela fonctionne si vous utilisez la plaine JNDI? Comme pour le Singleton DbPool vous êtes en train de parler, il ne devrait pas être la cause du problème, mais au moins ce n'est pas très bon. Vous ne devriez pas être à l'aide d'un Singleton. Voici un bon exemple de base de la façon de tout faire correctement: balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html Espérons que cette aide.merci beaucoup pour le lien je vais jeter un oeil. j'ai créé un bare-bones projet juste à faire ce travail, je pense que je vais l'avoir compris très tôt.
OriginalL'auteur BalusC
Votre web.xml définir la ressource? Jetez un oeil à cet exemple. Pourriez-vous poster votre web.xml ou le code qui définit le jdbc/Mabase?
OriginalL'auteur John Paulett