【发布时间】:2019-06-24 03:58:08
【问题描述】:
我开发了一个 Java Web 应用程序,它使用 JDBC 连接器连接到 MySQL 数据库并建立 2 个连接池。该应用程序部署在 tomcat 服务器上。
我的问题是,如果我多次部署应用程序并且在我关闭 tomcat 时代码没有任何行来关闭可用连接,此代码是否会影响 MySQL 可用连接?重启时tomcat会关闭连接吗?
连接工具:
import javax.sql.DataSource;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.impl.GenericObjectPool;
public class MySQLConnectionPool {
public static DataSource setUpPool(){
GenericObjectPool gPool = null;
String dbName = "DBName";
String userName = "Username";
String password = "Password";
String hostname = "Host";
String port = "Port";
try {
Class.forName("com.mysql.jdbc.Driver");
// Creates an Instance of GenericObjectPool That Holds Our Pool of Connections Object!
gPool = new GenericObjectPool();
gPool.setMaxActive(2);
// Creates a ConnectionFactory Object Which Will Be Use by the Pool to Create the Connection Object!
ConnectionFactory cf = new DriverManagerConnectionFactory("jdbc:mysql://" + hostname + ":" + port + "/" + dbName, userName, password);
// Creates a PoolableConnectionFactory That Will Wraps the Connection Object Created by the ConnectionFactory to Add Object Pooling Functionality!
PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf, gPool, null, null, false, true);
}catch (Exception e) {
// TODO: handle exception
System.out.println("Error: "+e.toString());
}
return new PoolingDataSource(gPool);
}
}
道:
@Override
public ArrayList<User> getUserDetails(String environment, String MySQLQuery) {
// TODO Auto-generated method stub
ArrayList<User> users = new ArrayList<User>();
Connection connObj = null;
Statement stmt = null;
ResultSet result = null;
try {
DataSource dataSource = MySQLConnectionPool.setUpPool();
// Performing Database Operation!
System.out.println("\n=====Making A New Connection Object For Db Transaction=====\n");
connObj = dataSource.getConnection();
stmt = connObj.createStatement();
result = stmt.executeQuery(MySQLQuery);
while(result.next()) {
//Some code here
}
System.out.println("\n=====Releasing Connection Object To Pool=====\n");
} catch(Exception sqlException) {
} finally {
try {
// Closing ResultSet Object
if(result != null) {
result.close();
}
// Closing Statement Object
if(stmt != null) {
stmt.close();
}
// Closing Connection Object
if(connObj != null) {
connObj.close();
}
} catch(Exception sqlException) {
}
}
return users;
}
【问题讨论】:
-
您应该定义一个且只有一个连接池,您当前的代码是在每次调用
MySQLConnectionPool.setUpPool()时创建一个新池。那是一场等待发生的事故。还可以考虑查看内置于 tomcat 中的数据源/连接池支持,而不是尝试(严重)推出您自己的解决方案。还可以了解 try-with-resources:您当前的资源处理很脆弱且不必要地复杂。 -
@MarkRotteveel:谢谢!!如果我将 maxActive 更改为 1,我的问题会得到解决吗?我是 Java 新手,不知道如何确保这段代码不会影响我的生产数据库。
-
我的主要观点是,您目前所做的完全是错误的方法,将 maxActive 减少到 1 只是对糟糕解决方案的微不足道的改变。如需更好的方法,请参阅 Tomcat 9 文档:tomcat.apache.org/tomcat-9.0-doc/… 或考虑使用 Spring 或 Spring Boot 之类的东西。
标签: java tomcat jdbc datasource