我应该如何在基于servlet的应用程序中连接到JDBC数据库/数据源?

我有一个外部的MySQL服务器设置和工作正常。 我在Eclipse中创建了一个数据库连接,并可以在“数据源浏览器”选项卡中查看数据库。

现在,我有一个需要访问该数据库的servlet。 我该怎么做? 有没有办法引用在数据源资源管理器中创建的数据库连接,还是我必须定义两次?

另外,打开连接的最佳方式是什么? 我已经包含了mysql-connector-java-5.1.11-bin.jar文件,并且发现了两种工作方式:

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

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

既不是最佳的,因为首先,他们都使用硬编码的字符串的一切。 这是一个Java EE的Web应用程序项目,那么有一个好的地方可以把连接数据? 或者有没有办法放弃所有这一切,只是在数据源浏览器中使用连接?

通常的做法是将其配置为相关servlet容器中的一个DataSource 。 它将为您提供连接池设施,这将大大提高性能。 另外一个常见的做法是将放置在类路径中的一些配置文件中的原始设置外化。

如果您使用Tomcat作为servletcontainer,则需要按照其JNDI文档配置数据源。 你会看到有几种方法。 最简单的方法是在动态web项目的webcontent中创建一个/META-INF/context.xml (要清楚, /META-INF与webapp的/WEB-INF处于同一级别)并填充它像这样的东西:

 <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/db" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" url="jdbc:mysql://hostname.com/db" driverClassName="com.mysql.jdbc.Driver" username="user" password="pass" /> </Context> 

这大致意味着Tomcat服务器应该创建一个JNDI名称为jdbc/db的数据源,最多有100个活动连接,最多30个空闲连接,最大等待时间为10000毫秒,然后才能从应用程序返回连接:由您的应用程序关闭,因此您的应用程序在获取连接和关闭连接之间有10秒的时间)。 剩下的设置应该是熟悉的,足够自我解释给你的; 这些是JDBC设置。

最后,在您的Web项目中,编辑文件/WEB-INF/web.xml以添加以下条目:

 <resource-env-ref> <resource-env-ref-name>jdbc/db</resource-env-ref-name> <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> 

这大致意味着web应用程序应该使用服务器提供的名称为jdbc/db数据源。

然后改变你的连接管理器,如下所示:

 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(); } 

..并用new Database("jdbc/db")替换所有Class.forName(driver)调用,并用database.getConnection()替换所有的DriverManager.getConnection()调用。 你可以根据需要从某个配置文件( 属性文件? )获取值jdbc/db

或者,通过@Resource注释将DataSource注入容器管理的工件(例如@WebServlet servlet类)中:

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

应该是这样的。 只要部署您的Web应用程序与上述更改并运行它。 不要忘记将数据库JDBC驱动程序放在Tomcat/lib或将其路径添加到Tomcat/conf/catalina.propertiesshared.loader属性中,因为加载JDBC驱动程序的责任现在从Web应用程序移动到服务器。 有关更多提示和其他基本的JDBC / JNDI示例,您可能会发现这篇文章也很有用。

也可以看看:

  • 如何在Eclipse Web项目中安装JDBC驱动程序而不面临java.lang.ClassNotFoundexception
  • 我要在哪里放置用于Tomcat连接池的JDBC驱动程序?
  • 在多线程系统中使用静态java.sql.Connection实例是否安全?
  • 在JSP页面中使用MVC和DAO模式在HTML中显示JDBC ResultSet
  • 如何从JSP页面中的数据库中检索和显示图像?

您可以在您将WAR部署到的任何应用程序服务器中设置数据源,并使用JNDI获取对其的引用。 或者你可以把你的WAR打包成一个EAR,并在EAR的data-sources.xml文件中定义数据源(并通过JNDI获取对它的引用)。