¿Cómo debo conectarme a la base de datos / fuente de datos JDBC en una aplicación basada en servlet?

Tengo un servidor MySQL externo que está configurado y funciona bien. Creé una conexión de base de datos en Eclipse y puedo ver la base de datos en la pestaña Explorador del origen de datos.

Ahora, tengo un servlet que necesita acceder a esa base de datos. ¿Cómo lo hago? ¿Hay alguna manera de hacer referencia a la conexión de la base de datos creada en el explorador de la fuente de datos, o tengo que definir todo dos veces?

Además, ¿cuál es la mejor manera de abrir la conexión? Tengo el archivo mysql-connector-java-5.1.11-bin.jar incluido, y he encontrado dos métodos que funcionan:

 MysqlDataSource d = new MysqlDataSource(); d.setUser("user"); d.setPassword("pass"); d.setServerName("hostname.com"); d.setDatabaseName("db"); Connection c = d.getConnection(); 

y

 Connection c = DriverManager.getConnection("jdbc:mysql://hostname.com/db","user","pass"); 

Ninguno es óptimo, porque antes que nada, ambos usan cadenas codificadas para todo. Este es un proyecto de aplicación web Java EE, ¿hay un buen lugar para poner datos de conexión? ¿O hay alguna manera de olvidar todo eso y simplemente usar la conexión en el explorador de la fuente de datos?

Una práctica común es configurar esto como un DataSource en el contenedor de servlets en cuestión. Le proporcionará instalaciones de agrupación de conexiones que mejorarán en gran medida el rendimiento. También es una práctica común externalizar las configuraciones sin formato en algún archivo de configuración que se haya colocado en el classpath.

En caso de que esté utilizando Tomcat como servletcontainer, necesita configurar el origen de datos según su documentación JNDI . Verás que hay varias formas. La manera más fácil es crear un /META-INF/context.xml en el contenido web de su proyecto web dynamic (para que quede claro, el /META-INF está en el mismo nivel que /WEB-INF de la aplicación web) y llenarlo con algo como:

 < ?xml version="1.0" encoding="UTF-8"?>    

Esto significa aproximadamente que el servidor Tomcat debe crear una fuente de datos con el nombre JNDI jdbc/db con un máximo de 100 conexiones activas, un máximo de 30 conexiones inactivas y un tiempo de espera máximo de 10000 milisegundos antes de que se devuelva una conexión desde la aplicación (en realidad : cerrado por su aplicación, por lo que su aplicación tiene un tiempo de 10 segundos entre la adquisición de la conexión y el cierre de la conexión). El remanente de la configuración debería ser lo suficientemente familiar y autoexplicativo para usted; esas son las configuraciones de JDBC.

Finalmente, en su proyecto web, edite el archivo /WEB-INF/web.xml para agregar la siguiente entrada:

  jdbc/db javax.sql.DataSource  

Esto significa aproximadamente que la aplicación web debe usar la fuente de datos proporcionada por el servidor con el nombre jdbc/db .

Luego, cambie su administrador de conexión a algo como esto:

 private DataSource dataSource; public Database(String jndiname) { try { dataSource = (DataSource) new InitialContext().lookup("java:comp/env/" + jndiname); } catch (NamingException e) { // Handle error that it's not configured in JNDI. throw new IllegalStateException(jndiname + " is missing in JNDI!", e); } } public Connection getConnection() { return dataSource.getConnection(); } 

..y reemplazar todas las llamadas Class.forName(driver) por la new Database("jdbc/db") y reemplazar todas las llamadas de DriverManager.getConnection() por database.getConnection() . Si es necesario, puede obtener el valor jdbc/db de algún archivo de configuración ( ¿Archivo de propiedades? ).

Alternativamente, inyecte DataSource través de la anotación @Resource dentro de un artefacto gestionado por un contenedor, como una clase de servlet @WebServlet :

 @Resource("jdbc/db") private DataSource dataSource; 

Eso debería ser. Simplemente implemente su aplicación web con los cambios anteriores y ejecútelo. No olvide colocar el controlador JDBC de la base de datos en Tomcat/lib o agregar su ruta a la propiedad shared.loader de Tomcat/conf/catalina.properties , porque la responsabilidad de cargar el controlador JDBC ahora se transfiere de la aplicación weba a el servidor. Para obtener más sugerencias y otros ejemplos básicos de JDBC / JNDI, también puede encontrar este artículo útil.

Ver también:

  • Cómo instalar el controlador JDBC en el proyecto web de Eclipse sin enfrentar java.lang.ClassNotFoundexception
  • ¿Dónde debo colocar el controlador JDBC para el conjunto de conexiones de Tomcat?
  • ¿Es seguro usar una instancia java.sql.Connection estática en un sistema multiproceso?
  • Mostrar JDBC ResultSet en HTML en la página JSP usando el patrón MVC y DAO
  • ¿Cómo recuperar y visualizar imágenes desde una base de datos en una página JSP?

Puede configurar una fuente de datos en cualquier servidor de aplicaciones donde esté desplegando su WAR y buscar una referencia con JNDI. O puede empaquetar su WAR en un EAR y definir el origen de datos en el archivo data-sources.xml del EAR (y obtener una referencia al mismo con JNDI).