【发布时间】:2015-07-27 13:55:12
【问题描述】:
我需要实现使用 Servlet 和 JSP 页面的 Web 应用程序的连接池。我不想在服务器中的所有应用程序之间建立连接池,而是希望在所有 servlet 之间实现连接池。
我有一个 C3P0 的工作实现,但我不知道这是不是正确的方法,这样做会产生预期的结果。
以下是我的实现 有一个数据源文件 C3P0 实现来返回连接。 连接将在servelet init 方法上检索并在destroy 方法上关闭。
- 这种类型的实现是否会产生预期的结果?
- 我必须在销毁时关闭连接吗?
- 还有哪些其他方法可以实现与 servlet 应用程序的连接池?
- 我喜欢将所有与 db 相关的操作移动到单独的类中,在这种情况下,我需要处理哪些事情?在这种情况下,我是否必须在 servlet 中获得连接并传递给 db 方法?
- 请给出当前实现的优缺点
请在下面找到我的连接池实现
返回连接的数据源文件和使用该连接的Servlet
数据源文件
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DataSource {
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://dburl/dbName";
// Database credentials
static final String USER = "username";
static final String PASS = "password";
private static DataSource datasource;
private ComboPooledDataSource cpds;
private DataSource() throws IOException, SQLException, PropertyVetoException {
cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver"); //loads the jdbc driver
cpds.setJdbcUrl(DB_URL);
cpds.setUser(USER);
cpds.setPassword(PASS);
// the settings below are optional -- c3p0 can work with defaults
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);
cpds.setMaxStatements(180);
}
public static DataSource getInstance() throws IOException, SQLException, PropertyVetoException {
if (datasource == null) {
datasource = new DataSource();
return datasource;
} else {
return datasource;
}
}
public Connection getConnection() throws SQLException {
return this.cpds.getConnection();
}
}
Servlet
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ConnectionTest
*/
@WebServlet("/ConnectionTest")
public class ConnectionTest extends HttpServlet {
Connection connection = null;
Statement statement = null;
@Override
public void init() throws ServletException {
super.init();
try {
connection = DataSource.getInstance().getConnection();
} catch (PropertyVetoException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<h1> Hi</h1>");
ResultSet resultSet = null;
try {
statement = connection.createStatement();
resultSet = statement
.executeQuery("SELECT VehicleRegistration FROM Registration");
while (resultSet.next()) {
String first = resultSet.getString("VehicleRegistration");
// Display values
out.println("<h1> " + first + "</h1>");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (resultSet != null)
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (statement != null)
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
public void destroy() {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
super.destroy();
}
}
我欢迎所有建议,即使它太小或太大,这有助于我改进此代码
先谢谢大家
【问题讨论】:
-
为什么要投反对票,我喜欢改进给定的代码并需要专家建议,我认为这样做是为了“改进我们的编码方式”
标签: java servlets connection-pooling c3p0