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

Tomcat 在基于servlet的应用程序中,我应该如何连接到JDBC数据库/数据源?,tomcat,servlets,jdbc,datasource,Tomcat,Servlets,Jdbc,Datasource,我有一个外部MySQL服务器,它的设置和工作良好。我在Eclipse中创建了一个数据库连接,可以在数据源浏览器选项卡中查看数据库 现在,我有一个servlet需要访问该数据库。我该怎么做?是否有方法引用在数据源资源管理器中创建的数据库连接,或者我必须对所有内容定义两次 另外,打开连接的最佳方式是什么?我已经包含了mysql-connector-java-5.1.11-bin.jar文件,我发现了两种有效的方法: MysqlDataSource d = new MysqlDataSource();

我有一个外部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();


两者都不是最优的,因为首先,它们都使用硬编码字符串。这是一个JavaEEWeb应用程序项目,所以有一个放置连接数据的好地方吗?或者有没有一种方法可以放弃所有这些,只使用数据源浏览器中的连接?

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

一种常见做法是将其配置为相关的。它将为您提供连接池功能,这将大大提高性能。还有一种常见的做法是将原始设置外部化到放置在类路径中的一些配置文件中

如果您使用的是as servletcontainer,则需要根据其配置数据源。你会发现有几种方法。最简单的方法是在动态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>
这大致意味着webapplication应该使用服务器提供的数据源,名称为
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();
}
…并将所有
Class.forName(driver)
调用替换为
newdatabase(“jdbc/db”)
并将所有
DriverManager.getConnection()
调用替换为
Database.getConnection()
。如有必要,您可以从一些配置文件()中获取值
jdbc/db

或者,通过容器管理工件(如servlet类)内的注释注入
数据源

@Resource(name="jdbc/db")
private DataSource dataSource;
应该是这样。只需使用上述更改部署Web应用程序并运行它。不要忘记将数据库JDBC驱动程序放在
Tomcat/lib
中,或者将其路径添加到
Tomcat/conf/catalina.properties
共享.loader
属性中,因为加载JDBC驱动程序的责任现在从Web应用程序转移到了服务器。有关更多提示和其他基本JDBC/JNDI示例,您可能会发现它们也很有用

另见:

这看起来非常有用。还有两个问题。1:我不知道这是否只是我,或者这是正常的,但是没有tomcat/lib目录,在common/lib、server/lib和shared/lib上有几个lib目录。我的罐子应该放进哪一个?问题2:在这里设置连接池时,它会处理连接池吗?每次使用getConnection()返回的连接是否需要调用close()?1)显然您使用的是6~8岁的Tomcat 5.x。如果可以(强烈建议)升级到Tomcat 6.0,或者使用Tomcat 5.x的
/shared/lib
。2) 是的,它将处理连接池。是的,您应该始终在
finally
中调用
close()。连接池实现本身将担心关闭或释放。还可以查看最后提到的链接的最后一章。@BalusC尽管这篇文章有点旧,但我有一个问题。有没有办法对密码进行加密?在context.xml中,密码是明文的,所以无论如何,要在Eclipse中将数据源创建与web应用程序集成,对于tomcat 7,密码应该是MySQL数据源jdbc/db javax.sql.datasource容器
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();
}
@Resource(name="jdbc/db")
private DataSource dataSource;