2012-02-09 17 views
8

Estoy intentando configurar la agrupación de conexiones a datos de mysql con tomcat. Mi aplicación sencilla se llama Projekt, en mi Projekt.xml en Apache/conf/Catalina/localhost tengoagrupación de conexiones Tomcat y JDBC

<Context docBase="Projekt.war" path="/Projekt"> 
    <Resource name="jdbc/mysqldb" 
     auth="Container" 
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
     type="javax.sql.DataSource" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/Music" 
     username="andrzej" 
     password="qazxsw" 
     maxActive="20" 
     maxIdle="30" 
     maxWait="5" 
    /> 
</Context> 

web.xml de mi aplicación

<servlet> 
    <servlet-name>HelloServlet</servlet-name> 
    <servlet-class>org.jtp.HelloServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>HelloServlet</servlet-name> 
    <url-pattern>/Hai</url-pattern> 
</servlet-mapping> 

<resource-ref>  
     <description>DB Connection</description>  
     <res-ref-name>jdbc/mysqldb</res-ref-name>  
     <res-type>javax.sql.DataSource</res-type>  
     <res-auth>Container</res-auth>  
</resource-ref> 

y en mi carpeta de Apache/lib I tienen

mysql-connector-java-5.1.18-bin.jar 

pero cuando ejecuto este código:

Context initContext = new InitialContext(); 
dataSource = (DataSource)initContext.lookup("java:comp/env/jdbc/mysqldb"); 
System.out.println(dataSource.getConnection().createStatement(). 
      execute("select * from Users")); 

consigo excepción

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' 

Estoy desconcertado ahora, en algunos lugares que he leído que puede ser causada por no puesta conductor en Tomcat/lib, pero lo tengo y funciona, porque cuando he probado el controlador con conexiones manuales funcionó.

Con mi configuración que estaba tratando de seguir http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

EDIT: Finalmente tengo trabajo, parecía que tenía algunas etiquetas de contexto izquierda en uno de los archivos de modo que cuando análisis sintáctico que overriden otros atributos, por lo que es todo culpa mía al final.

Respuesta

10

Parece que se echa en falta Context envCtx = (Context) initCtx.lookup("java:comp/env");
búsqueda JNDI debe hacerse así:

// Obtain our environment naming context 
Context initCtx = new InitialContext(); 
Context envCtx = (Context) initCtx.lookup("java:comp/env"); 

// Look up our data source 
DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); 

// Allocate and use a connection from the pool 
Connection conn = ds.getConnection(); 

documentación de http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html.

+0

Todavía el mismo error, utilicé este constructo antes, pero en algún lugar encontré el que cité, de todos modos ambos devuelven el mismo error. – Andna

+0

Parece que este tipo tuvo el mismo problema y ha publicado una solución http://blogs.agilefaqs.com/2009/11/23/cannot-create-jdbc-driver-of-class-for-connect-url-null/ – drobson

+0

Todavía nada, puedo escribir en esta carpeta, incluso creé contex.xml en mi aplicación web, sigue siendo el mismo error. – Andna

13

Para lograr la agrupación de conexiones JDBC con Tomcat, existe una alternativa a los archivos de configuración XML. Nunca he podido obtener esas Context y resource-ref etiquetas para trabajar. Además, esas etiquetas son excesivas si realmente no necesita las características JNDI.

La alternativa es usar código de Java para configurar agrupación de conexiones JDBC de Tomcat. Consulte el código de ejemplo en la sección Plain Ol 'Java de la página de documentación de Tomcat 7, The Tomcat JDBC Connection Pool.

Básicamente, usted:

  1. ejecutar un objeto PoolProperties para almacenar la configuración (URL para la base de datos, nombre de usuario db, db contraseña, y tal).
  2. Cree una instancia de un objeto Tomcat DataSource al pasar el objeto PoolProperties desde el paso n. ° 1 anterior.

Easy peasy.Así ...

PoolProperties p = new PoolProperties(); 
p.setUrl(jdbc:postgresql://localhost:5432/" + "my_database_name"); 
p.setDriverClassName("org.postgresql.Driver"); 
p.setUsername("someUserName"); 
p.setPassword("somePassword"); 
… 
DataSource datasource = new org.apache.tomcat.jdbc.pool.DataSource(p); 
datasource.setPoolProperties(p); 

Para utilizar la fuente de datos ...

Connection conn = null; 
try { 
    conn = datasource.getConnection(); 
    … 

La instancia de origen de datos se puede almacenar:

+0

Esto es increíble. Gracias. –

+0

esto es lo que estoy buscando más de 3 días ...! :) gracias por compartir ....! – Saedawke

Cuestiones relacionadas