使用 Java 和 Tomcat 7 的基本数据库连接池
Posted
技术标签:
【中文标题】使用 Java 和 Tomcat 7 的基本数据库连接池【英文标题】:Basic DB connection pool with Java and Tomcat 7 【发布时间】:2012-11-27 08:46:40 【问题描述】:我正在尝试创建我的第一个连接池。我正在使用 Tomcat 7 和 mysql DB 创建一个 Java Web 应用程序,并且我想创建最简单的连接池。 我看了几个教程,但对我来说不是很清楚,所以我希望你确认我是否做得很好。
我编写了以下类作为连接池管理器:
package dao.mysql;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
public class MySQLConnectionPool
private static DataSource datasource;
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/mydb";
private static String username = "user";
private static String password = "password";
public MySQLConnectionPool()
datasource = new DataSource(configurePoolProperties(driver, url, username, password));
private PoolProperties configurePoolProperties(String driver, String url, String username, String password)
PoolProperties properties = new PoolProperties();
properties.setDriverClassName(driver);
properties.setUrl(url);
properties.setUsername(username);
properties.setPassword(password);
return properties;
public static synchronized Connection getConnection()
Connection connection = null;
try
connection = datasource.getConnection();
catch (SQLException ex)
System.out.println("Error while getting a connection from the pool! \nSQL state:" + ex.getSQLState() + "\nMESSAGE" + ex.getMessage());
return connection;
我不确定静态属性和同步属性。
而且我不确定池的“客户端”类。我知道他们只需使用
Connection con = MySQLConnectionPool.getConnection();
最后使用
关闭此连接con.close();
就这样吗? 另外,有没有更简单或更好的方法来做到这一点?
非常感谢!
【问题讨论】:
【参考方案1】:这是错误的做法。
Tomcat 已经有一个连接池,您可以通过conf
目录下的context.xml
进行配置和设置,无需任何代码。
一旦在那里定义,您需要做的就是在您的代码中查找 JNDI 数据源。硬编码所有这些(并重新发明***)是一个非常糟糕的主意。
要了解如何配置 JNDI 数据源,请查看手册:http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html
Tomcat 手册中还有一个关于如何从池中获取连接的示例:
InitialContext cxt = new InitialContext();
DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/dsname" );
其中dsname
是您在context.xml
中提供的名称
【讨论】:
DAO 不管理数据源,它只是使用它。您可能还想阅读 JavaEE 教程:docs.oracle.com/javaee/6/tutorial/doc/bncjj.html 如果连接池在Tomcat中配置为JNDI DataSource,并且Resource的工厂属性为org.apache.tomcat.jdbc.pool.DataSourceFactory
,那么从java类访问数据源时DataSource类型是什么?我用org.apache.tomcat.jdbc.pool.DataSource
,还是应该是javax.sql.DataSource
(后者是Resource的type
属性的值)?【参考方案2】:
查看JNDI Datasource HOW-TO 和Tomcat JDBC Connection Pool Tomcat 文档。最好让 Tomcat 来做,尤其是因为它可以避免类加载器泄漏。
【讨论】:
以上是关于使用 Java 和 Tomcat 7 的基本数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章
使用 CLI/Boto 创建 Java 7、Tomcat 7 Elastic Beanstalk 实例