J'ai essayé d'exécuter le projet sur Tomcat 7.0.52
et d'initialiser la base de données via le fichier context.xml
.
Mais il jette un tas d'exceptions, je ne pouvais pas comprendre ce qui ne va pas là-bas.
Voici la sortie de la console:
Java.sql.SQLException: com.mysql.jdbc.Driver
at org.Apache.Tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.Java:254)
at org.Apache.Tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.Java:182)
at org.Apache.Tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.Java:701)
at org.Apache.Tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.Java:635)
at org.Apache.Tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.Java:486)
at org.Apache.Tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.Java:144)
at org.Apache.Tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.Java:116)
at org.Apache.Tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.Java:103)
at org.Apache.Tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.Java:554)
at org.Apache.Tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.Java:242)
at org.Apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.Java:141)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.Java:321)
Voici full stack trace .
Voici la sortie vers Tomcat catalina log
extrait de web.xml:
<resource-ref>
<description>Travel Agency Datasource</description>
<res-ref-name>jdbc/onlinedb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
context.xml:
<Context>
<Resource name="jdbc/onlinedb"
type="javax.sql.DataSource"
factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory"
maxActive="20" maxIdle="10"
maxWait="-1"
username="root"
password="secret"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/travelagency?characterEncoding=utf8"/>
</Context>
ConnectionManager classe:
public class ConnectionManager {
private static Logger log = Logger.getLogger(ConnectionManager.class);
public static Connection getConnection() throws SQLException {
Connection con = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("Java:/comp/env");
DataSource datasource = (DataSource) envContext.lookup("jdbc/onlinedb");
con = datasource.getConnection();
} catch (NamingException e) {
log.error(e);
}
return con;
}
}
mysql-connector-Java-5.1.27-bin.jar
est ajouté à cp:
J'ai essayé de changer le contenu du fichier context.xml:
<resource-env-ref>
<description>Travel Agency Datasource</description>
<resource-env-ref-name>jdbc/onlinedb</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
Mais cela continue à échouer.
Comment résoudre ce problème?
Vous devez ajouter un pilote MySQL jdbc au classpath.
Placez un fichier jar binaire MySQL dans le dossier Tomcat lib ou ajoutez-le au dossier application WEB-INF/lib.
Vous pouvez trouver un fichier binaire (modifiez la version en conséquence _): https://mvnrepository.com/artifact/mysql/mysql-connector-Java/5.1.27
Lorsque vous rencontrez de telles exceptions, les informations les plus utiles se trouvent généralement au bas de la pile:
Caused by: Java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at Java.net.URLClassLoader$1.run(URLClassLoader.Java:366)
...
at org.Apache.Tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.Java:246)
Le problème est que Tomcat ne peut pas trouver com.mysql.jdbc.Driver
. Cela est généralement dû au fait que le fichier JAR contenant le pilote MySQL n'est pas là où Tomcat s'attend à le trouver (notamment dans le répertoire webapps/<yourwebapp>/WEB-INF/lib
).
J'ai également traité cette exception après qu'une configuration pleinement fonctionnelle de context.xml a été ajustée. Je ne voulais pas de détails sur l'environnement dans le fichier context.xml, je les ai donc retirés et j'ai vu cette erreur. J'ai réalisé que je devais créer entièrement cette ressource de source de données dans un code basé sur les arguments System Property JVM -D.
Erreur d'origine avec seulement l'utilisateur/pwd/hôte supprimé: Org.Apache.Tomcat.jdbc.pool.ConnectionPool init SEVERE: impossible de créer les connexions initiales du pool.
Supprimez tout le contenu de context.xml et essayez ceci: Initialisez au démarrage du serveur d'applications l'objet source de données à un moment donné avant la première connexion. Si vous utilisez Spring, vous pouvez le faire dans un bean @Configuration du constructeur de @Bean Datasource.
package à utiliser: org.Apache.Tomcat.jdbc.pool. *
PoolProperties p = new PoolProperties();
p.setUrl(jdbcUrl);
p.setDriverClassName(driverClass);
p.setUsername(user);
p.setPassword(pwd);
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setValidationQueryTimeout(100);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(5);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(5);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors(
"org.Apache.Tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.Apache.Tomcat.jdbc.pool.interceptor.StatementFinalizer");
org.Apache.Tomcat.jdbc.pool.DataSource ds = new org.Apache.Tomcat.jdbc.pool.DataSource();
ds.setPoolProperties(p);
return ds;
J'utilise sprint-boot (2.1.1), et la version de MySQL est 8.0.13. J'ajoute la dépendance dans pom, résout mon problème.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>8.0.13</version>
</dependency>
MySQL Connector/J »8.0.13 lien: https://mvnrepository.com/artifact/mysql/mysql-connector-Java/8.0.13
MySQL Connector/J »Tous les liens de version: https://mvnrepository.com/artifact/mysql/mysql-connector-Java