प्रति ऐप तैनाती के लिए समाधान
यह एक श्रोता है जिसे मैंने समस्या को हल करने के लिए लिखा है: यह ऑटोडेटेक्ट्स है यदि ड्राइवर ने खुद को पंजीकृत किया है और तदनुसार कार्य करता है
महत्वपूर्ण: इसका उपयोग केवल तब किया जाता है जब ड्राइवर जार WEB-INF / lib में तैनात होता है , न कि Tomcat / lib में, जैसा कि कई सुझाव देते हैं, ताकि प्रत्येक एप्लिकेशन अपने स्वयं के ड्राइवर की देखभाल कर सके और अछूता Tomcat पर चला सके । यही तरीका है कि यह IMHO होना चाहिए।
बस किसी अन्य से पहले अपने web.xml में श्रोता को कॉन्फ़िगर करें और आनंद लें।
web.xml के शीर्ष के पास जोड़ें :
<listener>
<listener-class>utils.db.OjdbcDriverRegistrationListener</listener-class>
</listener>
बर्तनों / db / OjdbcDriverRegistrationListener.java के रूप में सहेजें :
package utils.db;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import oracle.jdbc.OracleDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Registers and unregisters the Oracle JDBC driver.
*
* Use only when the ojdbc jar is deployed inside the webapp (not as an
* appserver lib)
*/
public class OjdbcDriverRegistrationListener implements ServletContextListener {
private static final Logger LOG = LoggerFactory
.getLogger(OjdbcDriverRegistrationListener.class);
private Driver driver = null;
/**
* Registers the Oracle JDBC driver
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
this.driver = new OracleDriver(); // load and instantiate the class
boolean skipRegistration = false;
Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
if (driver instanceof OracleDriver) {
OracleDriver alreadyRegistered = (OracleDriver) driver;
if (alreadyRegistered.getClass() == this.driver.getClass()) {
// same class in the VM already registered itself
skipRegistration = true;
this.driver = alreadyRegistered;
break;
}
}
}
try {
if (!skipRegistration) {
DriverManager.registerDriver(driver);
} else {
LOG.debug("driver was registered automatically");
}
LOG.info(String.format("registered jdbc driver: %s v%d.%d", driver,
driver.getMajorVersion(), driver.getMinorVersion()));
} catch (SQLException e) {
LOG.error(
"Error registering oracle driver: " +
"database connectivity might be unavailable!",
e);
throw new RuntimeException(e);
}
}
/**
* Deregisters JDBC driver
*
* Prevents Tomcat 7 from complaining about memory leaks.
*/
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
if (this.driver != null) {
try {
DriverManager.deregisterDriver(driver);
LOG.info(String.format("deregistering jdbc driver: %s", driver));
} catch (SQLException e) {
LOG.warn(
String.format("Error deregistering driver %s", driver),
e);
}
this.driver = null;
} else {
LOG.warn("No driver to deregister");
}
}
}